Является ли anyMatch в Java Stream API промежуточной или терминальной операцией?

«Является ли anyMatch в Java Stream API промежуточной или терминальной операцией?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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.