Что возвращает метод forEach() в Java Stream API и коллекциях?

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

Ответ

Метод forEach() возвращает void. Это терминальная операция, предназначенная для выполнения действия (side-effect) над каждым элементом коллекции или стрима, а не для возврата нового объекта.

Примеры:

// 1. forEach в коллекциях (Iterable.forEach)
List<String> list = Arrays.asList("a", "b", "c");
list.forEach(item -> System.out.print(item + " ")); // Вывод: a b c

// 2. forEach в Stream API (Stream.forEach)
list.stream()
    .filter(s -> s.startsWith("a"))
    .forEach(System.out::println); // Вывод: a

Важные замечания:

  • Назначение: Используется для финальных действий: логирование, запись в файл, модификация внешних переменных.
  • Порядок: В параллельных стримах (parallelStream()) порядок выполнения forEach не гарантирован. Для сохранения порядка используйте forEachOrdered().
  • Не для преобразования: Для преобразования данных используйте промежуточные операции map() или flatMap(), а для сбора результатов — терминальную операцию collect().