Ответ
Метод 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()— терминальная.