Iterables.find и Iterators.find — вместо исключения исключения получите значение null

StackOverflow https://stackoverflow.com/questions/2543052

  •  23-09-2019
  •  | 
  •  

Вопрос

Я использую коллекции Google и пытаюсь найти первый элемент, который удовлетворяет Predicate, если нет, верните мне «ноль».

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

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

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

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

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

Это было полезно?

Решение

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

Другие советы

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

Iterables.find(iterable, predicate, null);

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

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

На самом деле мы работаем над этим.

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

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();
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top