Что такое терминальная операция в Java Stream API?

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

Ответ

Терминальная операция — это операция, которая завершает обработку потока данных (Stream), запускает выполнение цепочки вызовов и возвращает конечный результат (не Stream). После её выполнения поток считается потреблённым и не может быть использован повторно.

Ключевые особенности:

  • Запускает выполнение «ленивых» промежуточных операций (filter, map).
  • Возвращает конкретное значение (void, коллекцию, объект, Optional) или производит побочный эффект.
  • Поток можно обработать только одной терминальной операцией.

Примеры терминальных операций:

  • forEach(Consumer) – выполняет действие для каждого элемента.
  • collect(Collector) – собирает элементы в коллекцию, Map или строку.
  • reduce(...) – сводит элементы к одному значению (агрегация).
  • count(), min(), max(), sum(), average() – агрегатные операции.
  • findFirst(), findAny() – поиск элемента.
  • anyMatch(), allMatch(), noneMatch() – проверка условий.

Пример:

List<String> names = Arrays.asList("Anna", "Bob", "Alex");
// Промежуточная операция filter + терминальная count
long countLongNames = names.stream()
        .filter(name -> name.length() > 3) // ленивая операция
        .count(); // терминальная операция, запускает выполнение
System.out.println(countLongNames); // 2

Почему это важно: Без терминальной операции цепочка вызовов не выполнится. Такой дизайн позволяет оптимизировать обработку (например, объединять операции).