Iterables.find和Iterators.find - 而不是抛出异常,得到null

时间:2010-03-30 05:32:53

标签: java guava

我正在使用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 个答案:

答案 0 :(得分:13)

自Guava 7以来,您可以使用带有默认值的Iterables.find()重载来执行此操作:

Iterables.find(iterable, predicate, null);

答案 1 :(得分:5)

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

答案 2 :(得分:2)

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

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

我们实际上正在进行中。

答案 3 :(得分: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();
}