Ответ
anyMatch(Predicate p) — это терминальная (конечная) операция с коротким замыканием.
Почему терминальная?
- Она запускает выполнение всего пайплайна промежуточных операций (таких как
filter,map). - Возвращает конкретный результат (
boolean), а не новый Stream. - После её вызова поток считается потребленным, и повторно использовать его нельзя.
Почему с коротким замыканием? Как только находится первый элемент, удовлетворяющий предикату, обработка останавливается — нет необходимости обрабатывать весь поток.
Пример:
List<String> words = List.of("Java", "Stream", "API", "Lambda");
boolean hasShortWord = words.stream()
.peek(w -> System.out.println("Проверяется: " + w)) // Промежуточная операция для отладки
.anyMatch(w -> w.length() == 3); // Терминальная операция
System.out.println("Есть слово из 3 букв? " + hasShortWord);
Вывод:
Проверяется: Java
Проверяется: Stream
Проверяется: API
Есть слово из 3 букв? true
Обратите внимание: поток остановился после слова "API", так как условие выполнилось. Другие терминальные операции: allMatch, noneMatch, collect, forEach, count.