开发者

Iterables.find and Iterators.find - instead of throwing exception, get null

开发者 https://www.devze.com 2022-12-24 21:03 出处:网络
I\'m using google-collections and trying to find the first element that satisfies Predicate if not, return me \'null\'.

I'm using google-collections and trying to find the first element that satisfies Predicate if not, return me 'null'.

Unfortunately, Iterables.find and Iterators.find throws NoSuchElementException when no element is found.

Now, I am forced to do

Object found = null;
if ( Iterators.any( newIterator(...) , my_predicate )
{
    found = Iterat开发者_开发百科ors.find( newIterator(...), my_predicate )
}

I can surround by 'try/catch' and do the same thing but for my use-cases, I am going to encounter many cases where no-element is found.

Is there a simpler way of doing this?


Since Guava 7, you can do this using the Iterables.find() overload that takes a default value:

Iterables.find(iterable, predicate, null);


It sounds like you should be using Iterators.filter, then checking the value of hasNext on the returned iterator.


This was filed as a feature request:

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

We are actually in progress on it.


I'm not sure if this qualifies as simpler, but at least it avoids exceptions and requires only one pass over the source iterable:

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();
}
0

精彩评论

暂无评论...
验证码 换一张
取 消