2010-03-30 1 views
8

Я использую сборники google и пытаюсь найти первый элемент, который удовлетворяет Predicate, если нет, верните мне «null».Iterables.find и Iterators.find - вместо исключения исключения, get null

К сожалению, Iterables.find и Iterators.find выбрасывают исключение NoSuchElementException, когда элемент не найден.

Теперь я вынужден сделать

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

Я могу окружить «попытаться/поймать» и сделать то же самое, но для моих сценариев использования, я собираюсь встретить много случаев, когда нет-элемента найден.

Есть ли более простой способ сделать это?

ответ

5

Похоже, вы должны использовать Iterators.filter, а затем проверить значение hasNext на возвращенном итераторе.

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

С гуавы 7, вы можете сделать это с помощью Iterables.find() перегрузки, которая принимает значение по умолчанию:

Iterables.find(iterable, predicate, null);