Gymterview
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() в параллельном стриме снижает производительность, поскольку вынуждает потоки синхронизироваться для сохранения порядка.

На собеседовании: главное — объяснить разницу в контексте параллельных стримов. В последовательных стримах поведение идентично.