Iterables.find и Iterators.find - вместо того, чтобы выдать исключение, станьте пустыми

Я использую наборы Google и пытаюсь найти первый элемент, который удовлетворяет, Предикат в противном случае возвращают меня 'пустой'.

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

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

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

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

Существует ли более простой способ сделать это?

8
задан gpampara 30 March 2010 в 10:27
поделиться

3 ответа

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

5
ответ дан 5 December 2019 в 08:23
поделиться

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

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
ответ дан 5 December 2019 в 08:23
поделиться

Это было подано как запрос функции:

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

Мы действительно работаем над этим.

2
ответ дан 5 December 2019 в 08:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: