Является ли forEach в Java Stream API конечным или промежуточным методом?

«Является ли forEach в Java Stream API конечным или промежуточным методом?» — вопрос из категории Java, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

forEach в Java Stream API является конечным (terminal) методом. Он завершает поток, выполняя действие для каждого элемента, и не возвращает новый Stream.

Пример:

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream()
     .filter(name -> name.startsWith("A"))
     .forEach(System.out::println); // Конечная операция

Ключевые особенности:

  • После forEach нельзя вызвать другие методы потока — это вызовет ошибку компиляции.
  • В параллельных стримах (parallelStream()) порядок выполнения не гарантируется. Для сохранения порядка используйте forEachOrdered.
  • Сам метод не изменяет исходную коллекцию, но действие внутри (например, вызов сеттера) может изменить состояние элементов.