为什么Guava中的Iterables.find()抛出NoSuchElementException,而不是返回null?

时间:2010-06-23 05:45:42

标签: guava api-design

我喜欢谷歌番石榴并且经常使用它,但有一种方法我总是找我写作..

 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的方法的观点,也许是为了区分找到一个null而没有找到该元素,但只有当你使用的谓词是

时才会出现这种情况。
public boolean apply(T t){
     return t==null;
}

这似乎不是一个常见的情况。

那么为什么番石榴设计师选择了这种行为,而不是只是在找不到它时才返回null?

这是[Iterables.find()] [1]

的javadoc

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

5 个答案:

答案 0 :(得分:32)

我们正在添加另一个find()重载,它接受默认值。

答案 1 :(得分:13)

可能因为null是有效的返回值。一般来说,除非有充分的理由不支持null,否则应该支持它。如果它受支持,那么你必须处理它存在的情况。

答案 2 :(得分:5)

您可以使用filter并检查它是否返回空集合,而不是tryFind()。

我发现总是使用集合比直接询问对象更清晰。

答案 3 :(得分:3)

在我看来,NoSuchElementException比一个迟到且非常难以调试的NPE更好...... 在大多数情况下,当您在“集合”中搜索对象时,您知道您可能会找到它。 如果您正在寻找的对象不在“集合”中,那么您将面临一个例外情况......据我所知,NoSuchElementException反馈比无意义的“null”更明确。

将来番石榴版本中引入的默认值将是处理异常情况的有效捷径。

答案 4 :(得分:0)

如果无法找到默认值,那么查找会有意义。

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