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

Enn*_*oji 17 api-design guava

我喜欢谷歌番石榴并且使用它很多,但有一种方法我总能找到我写的..

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

对我来说,这似乎是一个非常有用的补充Iterables(也是Iterators为了那个问题),所以我想知道它为什么缺失.此外,虽然我可以看到有一个方法抛出的点NoSuchElementException,也许是为了区分找到一个null而没有找到该元素,但只有当你使用的谓词是

public boolean apply(T t){
     return t==null;
}
Run Code Online (Sandbox Code Playgroud)

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

那么为什么番石榴设计师选择了这种行为,而不是只是在找不到它时才返回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.谓语)

Kev*_*ion 32

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

  • `Iterables.find(iterable,predicate,defaultValue)`:) (6认同)

Tof*_*eer 13

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


Pet*_*ans 5

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

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