Что произойдет, если у стрима (Stream) в Java не вызвать терминальную операцию?

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

Ответ

Никакие вычисления не начнутся. Промежуточные операции (intermediate) ленивы и выполняются только при вызове терминальной операции (terminal).

Пример без терминальной операции:

List<Integer> numbers = Arrays.asList(1, 2, 3);
numbers.stream()
       .filter(n -> n > 1)  // Не выполнится
       .map(n -> n * 2);     // Не выполнится
// Стрим не активирован, никакого вывода или результата нет.

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

numbers.stream()
       .filter(n -> n > 1)   // Выполнится
       .map(n -> n * 2)      // Выполнится
       .forEach(System.out::println); // Терминальная операция, запускает весь конвейер
// Выведет: 4, 6

Популярные терминальные операции: collect(), forEach(), count(), reduce(), anyMatch(), findFirst().