Ответ
Терминальная операция — это операция, которая завершает обработку потока данных (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
Почему это важно: Без терминальной операции цепочка вызовов не выполнится. Такой дизайн позволяет оптимизировать обработку (например, объединять операции).