Iterables.find и Iterators.find - вместо того, чтобы генерировать исключение, получите ноль - PullRequest
8 голосов
/ 30 марта 2010

Я использую google-collection и пытаюсь найти первый элемент, который удовлетворяет предикату, если нет, верните мне 'null'.

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

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

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

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

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

Ответы [ 4 ]

13 голосов
/ 20 октября 2011

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

Iterables.find(iterable, predicate, null);
5 голосов
/ 30 марта 2010

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

2 голосов
/ 31 марта 2010

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

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

Мы на самом деле в процессе.

0 голосов
/ 30 марта 2010

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

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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...