Ответ
Метод 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— это просто выстрел в воздух. Шум есть, а пользы, кроме побочки, — ноль.