Какую функцию выполняет метод peek() в Java Stream API?

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

Ответ

Метод peek() — это промежуточная (lazy) операция в Stream API, которая позволяет выполнить побочное действие (side-effect) для каждого элемента, проходящего через конвейер, без изменения самих элементов.

Основное назначение — отладка и мониторинг:

List<String> result = Stream.of("A", "B", "C")
    .peek(e -> System.out.println("До фильтра: " + e))
    .filter(s -> !s.equals("B"))
    .peek(e -> System.out.println("После фильтра: " + e))
    .collect(Collectors.toList());
// Вывод:
// До фильтра: A
// После фильтра: A
// До фильтра: B
// До фильтра: C
// После фильтра: C

Важные предостережения:

  • Не для модификации: Не следует использовать peek() для изменения состояния элементов или внешних объектов — это нарушает принципы функционального стиля и может привести к непредсказуемому поведению, особенно в параллельных стримах.
  • Ленивость: Операция выполняется только при вызове терминальной операции.
  • Не замена forEach: peek() — промежуточная операция, forEach() — терминальная.