17

我喜欢 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就此而言),所以我想知道为什么它会丢失。此外,虽然我可以看到有一个 throws 方法的意义NoSuchElementException,也许是为了区分找到 null 和没有找到元素,但只有当您使用的谓词是时才会出现这种情况

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

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

那么为什么 guava 设计者选择了这种行为,而不是如果找不到就返回 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.谓词)

4

5 回答 5

31

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

于 2010-06-23T06:13:53.733 回答
13

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

于 2010-06-23T05:52:30.600 回答
5

您可以使用过滤器代替 tryFind() 并检查它是否返回空集合。

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

于 2010-06-23T06:03:07.957 回答
3

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

将在未来的 guava 版本中引入的默认值将是处理异常情况的有效快捷方式。

于 2010-06-23T22:56:07.437 回答
0

如果它无法找到而不是找到默认值,那么查找将是有意义的。

Optional<T> Iterables.find(Iterable<T>, Predicate<? super T>)
于 2013-04-10T14:03:34.520 回答