junior
Для чего в стримах применяются методы forEach и forEachOrdered?
forEach() и forEachOrdered() — терминальные операции, которые применяют заданную функцию (Consumer) к каждому элементу стрима. Разница проявляется при параллельной обработке.
| Метод | Гарантия порядка | Используется с |
|---|---|---|
forEach() |
Нет (при параллельном стриме порядок произвольный) | Когда порядок не важен |
forEachOrdered() |
Да (сохраняет порядок источника) | Когда порядок важен |
Для последовательного стрима оба метода работают одинаково — в порядке следования элементов. Разница возникает только при использовании parallelStream() или .parallel().
Пример
List.of(1, 2, 3, 4, 5).parallelStream()
.forEach(System.out::print); // порядок не гарантирован: например, 35241
List.of(1, 2, 3, 4, 5).parallelStream()
.forEachOrdered(System.out::print); // всегда: 12345
Следует помнить, что forEachOrdered() в параллельном стриме снижает производительность, поскольку вынуждает потоки синхронизироваться для сохранения порядка.
На собеседовании: главное — объяснить разницу в контексте параллельных стримов. В последовательных стримах поведение идентично.