Подтвердить что ты не робот

Почему Iterables.find() в Guava выбрасывает NoSuchElementException вместо того, чтобы возвращать null?

Я люблю Google Guava и использую его много, но есть один метод, который я всегда нахожу, что я пишу..

 public static <T> T tryFind(Iterable<T> iterable, Predicate<T> predicate){
     for(T t : iterable){
         if(predicate.apply(t)){
              return t;
         }
     }
     return null;
  }

Мне кажется, это очень полезное дополнение к Iterables (также к Iterators, если на то пошло), поэтому мне интересно, почему он отсутствует. Кроме того, хотя я могу видеть смысл метода, который бросает NoSuchElementException, возможно, чтобы различать поиск нулевого значения и не обнаруживать элемент, эта ситуация возникает только в том случае, если предикат, который вы используете,

public boolean apply(T t){
     return t==null;
}

который, как представляется, не является обычным случаем.

Итак, почему дизайнеры guava решили использовать это поведение вместо того, чтобы просто возвращать null, если он не может его найти?

Вот javadoc для [Iterables.find()] [1]

[1]: http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Iterables.html#find(java.lang.Iterable, com.google.common.base.Predicate)

4b9b3361

Ответ 1

Мы добавляем еще одну перегрузку find(), которая принимает значение по умолчанию.

Ответ 2

Вероятно, поскольку null является допустимым возвращаемым значением. Вообще говоря, если нет веской причины не поддерживать нуль, то он должен поддерживаться. Если он поддерживается, вам необходимо обработать случай, когда он существует.

Ответ 3

Вместо tryFind() вы можете использовать фильтр и проверить, возвращает ли он пустую коллекцию.

Я обнаружил, что всегда работа с коллекциями чище, чем непосредственно запрашивать объекты.

Ответ 4

По-моему, исключение NoSuchElementException лучше, чем поздно и очень сложно отлаживать NPE... В большинстве случаев, когда вы ищете объект в "коллекции", вы знаете, что, вероятно, найдете его. Если объект, который вы ищете, не находится в "коллекции", вы сталкиваетесь с исключительным случаем... По мне, обратная связь NoSuchElementException более ясна, чем бессмысленное "null".

Значение по умолчанию, которое будет введено в будущей версии guava, будет эффективным ярлыком для обработки исключительного случая.

Ответ 5

Найти будет иметь смысл, если он не сможет найти скорее значение по умолчанию.

Optional<T> Iterables.find(Iterable<T>, Predicate<? super T>)