Исследование поведения Stream.peek() при ленивом выполнении в Java

В современных JDK этот код может вообще ничего не вывести: count() способен получить известный размер Stream.of без обхода элементов. Наличие терминальной операции не гарантирует выполнение peek.

Короткий ответ

Что ответить на собеседовании

В современных JDK этот код может вообще ничего не вывести: count() способен получить известный размер Stream.of без обхода элементов. Наличие терминальной операции не гарантирует выполнение peek.

Подробный разбор

Ответ с пояснениями

Условие

Продемонстрировать, как работает отложенное (lazy) выполнение и в каком порядке обрабатываются элементы при использовании Stream API в Java. Что будет выведено в консоль и почему?

void m2(){
    Stream<Integer> src = Stream.of(1, 3, 2);
    src.peek(System.out::println)
        .peek(System.out::println)
        .count();
}

Ответ

В современных JDK этот код может вообще ничего не вывести: count() способен получить известный размер Stream.of без обхода элементов. Наличие терминальной операции не гарантирует выполнение peek.

Peek не меняет количество элементов, поэтому оба вызова могут быть пропущены оптимизацией. Если реализация выполняет последовательный обход, порядок будет 1, 1, 3, 3, 2, 2: каждый элемент проходит обе стадии перед следующим. Это не контракт обязательной печати. Для гарантированного вывода используйте forEachOrdered; peek подходит для диагностики, но не для важной бизнес-операции. Count вернёт 3, однако его результат в примере не печатается.

Источник: docs.oracle.com.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее