2015-02-20 2 views
1

С Java 8+ вы можете легко найти все элементы коллекции, которые соответствуют Predicate.Есть ли способ найти первый элемент, соответствующий Predicate?

someCollection.stream().filter(somePredicate) 

Вы могли бы найти первый элемент:

someCollection.stream().filter(somePredicate).findFirst() 

Проблема с этим, однако, заключается в том, что он запускает Predicate против всех элементов. Есть ли чистый способ запускать только Predicate против элементов до тех пор, пока не будет найдено первое совпадение, а затем вернет его, например, anyMatch делает (но возвращает boolean, если обнаруживается, что был найден)?

+1

Что заставляет вас думать, что проходит через все элементы 'Stream'? –

ответ

5

Он делает именно то, что вы хотите. Он не работает по всем элементам. Метод filter создает поток, а поверх него findFirst создает другой поток.

Итак, когда вы пытаетесь получить элемент потока, который был создан после findFirst(), вы получите только первый, который соответствует предикату.

Лучший способ проверить, что нужно добавить линию печати или что-то подобное внутри предиката.

Создайте поток целых чисел, например от 0 до 10, и создайте предикат, который печатает это число, а затем проверит, если он разделен на 3. Вы получите это распечатано: 0, 1, 2, 3, и это все ,

Я написал вопрос + ответ в прошлом, чтобы объяснить более подробно, как это работает: Understanding java 8 stream's filter method

+0

Эй, я тупой. – Pietu1998

+0

@ Pietu1998 - Я отредактировал вопрос, и он содержит ссылку на мой ответ + мой вопрос, который лучше объясняет это. – Avi

Смежные вопросы