8

我正在使用 google-collections 并试图找到满足 Predicate 的第一个元素,如果不是,则返回“null”。

不幸的是,当没有找到元素时,Iterables.find 和 Iterators.find 会抛出 NoSuchElementException。

现在,我被迫做

Object found = null;
if ( Iterators.any( newIterator(...) , my_predicate )
{
    found = Iterators.find( newIterator(...), my_predicate )
}

我可以用“try/catch”包围并做同样的事情,但对于我的用例,我会遇到很多找不到元素的情况。

有没有更简单的方法来做到这一点?

4

4 回答 4

13

从 Guava 7 开始,您可以使用采用默认值的 Iterables.find() 重载来执行此操作:

Iterables.find(iterable, predicate, null);
于 2011-10-20T12:14:45.757 回答
5

听起来您应该使用 Iterators.filter,然后在返回的迭代器上检查 hasNext 的值。

于 2010-03-30T10:45:05.753 回答
2

这是作为功能请求提交的:

http://code.google.com/p/guava-libraries/issues/detail?id=217

我们实际上正在进行中。

于 2010-03-30T21:49:55.020 回答
0

我不确定这是否更简单,但至少它避免了异常并且只需要遍历源可迭代对象:

public static <T> T findMatchOrNull(Iterator<T> source, Predicate<T> pred) {
    Iterator<T> matching = Iterators.filter(source, pred);
    Iterator<T> padded = Iterators.concat(matching, Iterators.<T>singletonIterator(null));
    return padded.next();
}
于 2010-03-30T10:50:47.647 回答