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

Ответ

Метод 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().

Ответ 18+ 🔞

Так, слушай, вот тут народ частенько путается, блядь. Метод forEach() — он, сука, ничего не возвращает, вообще, ноль, пустота, void. Это как прийти в гости, нагадить посреди комнаты и уйти. Действие совершил, а результата — нихуя.

Он создан именно для побочных эффектов: что-то вывести, куда-то записать, какую-то внешнюю переменную поменять. Не жди от него нового списка или стрима — он терминальный, конечный, тупиковый, нахуй.

Смотри, как это бывает:

// 1. Обычная коллекция, всё просто
List<String> list = Arrays.asList("a", "b", "c");
list.forEach(item -> System.out.print(item + " ")); // Напечатает: a b c
// И всё. Ничего тебе не вернул, пидорас.

// 2. Со стримами, после всех фильтров
list.stream()
    .filter(s -> s.startsWith("a"))
    .forEach(System.out::println); // Выведет только "a"
// И опять — тишина. Результат только на экране.

А теперь, блядь, важные моменты, чтобы не обосраться:

  • Зачем он? Чисто для финального действия. Лог написать, в файл плюнуть, глобальную переменную подшаманить. Не для преобразования данных! Это не map, ёпта.
  • Порядок — его проблема. Если взял parallelStream() и сделал forEach — получишь кашу, блядь. Элементы могут обрабатываться в каком попало порядке. Если порядок важен — есть forEachOrdered(), но он, естественно, медленнее.
  • Хочешь результат — иди в другую дверь. Чтобы данные преобразовать и получить новую коллекцию — тебе нужны map() или flatMap(), а потом всё это собрать в кучу через collect(). А forEach — это просто выстрел в воздух. Шум есть, а пользы, кроме побочки, — ноль.