Когда начинается выполнение Stream в Java?

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

Ответ

Выполнение 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

Преимущества ленивой обработки:

  • Оптимизация (пропуск ненужных операций)
  • Возможность обработки бесконечных стримов
  • Отложенное выполнение до необходимости