Почему Iterables.find () в Guava генерирует исключение NoSuchElementException вместо возврата null? - PullRequest
17 голосов
/ 23 июня 2010

Я люблю 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;
}

, что не кажется распространенным случаем.

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

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

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

Ответы [ 5 ]

32 голосов
/ 23 июня 2010

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

13 голосов
/ 23 июня 2010

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

5 голосов
/ 23 июня 2010

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

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

3 голосов
/ 24 июня 2010

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

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

0 голосов
/ 10 апреля 2013

Поиск имел бы смысл, если бы не мог найти скорее поиск значения по умолчанию.

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