Ответ
Выполнение Stream в Java начинается только при вызове терминальной операции (terminal operation). Это называется ленивой (lazy) обработкой.
Промежуточные операции (intermediate) только конфигурируют конвейер:
filter(),map(),sorted(),distinct()- Не выполняют обработку данных
Терминальные операции запускают выполнение:
collect(),forEach(),reduce()count(),anyMatch(),findFirst()
Пример:
List<String> list = Arrays.asList("a", "b", "c");
// Создание конвейера (ещё не выполняется)
Stream<String> stream = list.stream()
.filter(s -> {
System.out.println("filter: " + s); // Не выведется
return s.startsWith("a");
})
.map(String::toUpperCase);
// Терминальная операция запускает выполнение
List<String> result = stream.collect(Collectors.toList());
// Теперь выведется: filter: a, filter: b, filter: c
Преимущества ленивой обработки:
- Оптимизация (пропуск ненужных операций)
- Возможность обработки бесконечных стримов
- Отложенное выполнение до необходимости