Ответ 1
Мы добавляем еще одну перегрузку find(), которая принимает значение по умолчанию.
Я люблю 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)
Мы добавляем еще одну перегрузку find(), которая принимает значение по умолчанию.
Вероятно, поскольку null является допустимым возвращаемым значением. Вообще говоря, если нет веской причины не поддерживать нуль, то он должен поддерживаться. Если он поддерживается, вам необходимо обработать случай, когда он существует.
Вместо tryFind() вы можете использовать фильтр и проверить, возвращает ли он пустую коллекцию.
Я обнаружил, что всегда работа с коллекциями чище, чем непосредственно запрашивать объекты.
По-моему, исключение NoSuchElementException лучше, чем поздно и очень сложно отлаживать NPE... В большинстве случаев, когда вы ищете объект в "коллекции", вы знаете, что, вероятно, найдете его. Если объект, который вы ищете, не находится в "коллекции", вы сталкиваетесь с исключительным случаем... По мне, обратная связь NoSuchElementException более ясна, чем бессмысленное "null".
Значение по умолчанию, которое будет введено в будущей версии guava, будет эффективным ярлыком для обработки исключительного случая.
Найти будет иметь смысл, если он не сможет найти скорее значение по умолчанию.
Optional<T> Iterables.find(Iterable<T>, Predicate<? super T>)