Рубрики
Без рубрики

Методы Java Stream forEach() и forEachOrdered() используются для выполнения действий над его элементами. Это терминальные операции, параллельный поток для каждого примера

Методы Java Stream forEach() и forEachOrdered() используются для выполнения действий над его элементами. Это терминальные операции, параллельный поток для каждого примера

Автор оригинала: Pankaj Kumar.

  • Java Stream forEach() и forEachOrdered() являются терминальными операциями.
  • Метод forEach() используется для выполнения действия над каждым элементом потока.
  • Если метод forEach() используется с параллельным потоком, порядок встреч не поддерживается. Действие будет выполнено над каждым элементом, но их порядок не будет фиксирован.
  • Если вы хотите выполнить какое-либо действие с элементами потока в порядке встреч, вам следует использовать метод forEachOrdered ().
  • Базовая коллекция должна иметь порядок встреч, иначе для каждого упорядоченного() не сможет это соблюдать. Поэтому использовать его с набором деревьев или картой деревьев бесполезно.
  • Действие forEachOrdered() выполняется для каждого элемента потока по одному, поэтому оно немного медленнее, чем метод forEach ().
  • Использование для каждого упорядоченного() в параллельном потоке не обеспечивает преимуществ параллельного потока, поэтому его использование с параллельным потоком не имеет большого смысла.

Подпись методов Java Stream forEach() и forEachOrdered()

void forEach(Consumer action)

void forEachOrdered(Consumer&LT? super T&GT action);

Потребитель представляет собой Функциональный интерфейс . Он представляет собой операцию, которая принимает один входной аргумент и не возвращает результата.

Пример Stream forEach()

Давайте рассмотрим простой пример для печати всех элементов потока.

jshell> Stream streamNumbers = Stream.of(1, 2, 3, 4);
streamNumbers ==> java.util.stream.ReferencePipeline$Head@5a10411

jshell> streamNumbers.forEach(System.out::println);
1
2
3
4

jshell> 

Пример параллельного потока forEach()

Давайте посмотрим, что происходит, когда мы используем forEach() с параллельным потоком.

jshell> List list = List.of(1, 2, 3, 4, 5, 6, 7);
list ==> [1, 2, 3, 4, 5, 6, 7]

jshell> list.parallelStream().forEach(System.out::println);
5
4
1
3
2
7
6

jshell> 

Обратите внимание, что элементы потока располагаются в случайном порядке. Порядок встреч элементов не соблюдается, когда forEach() выполняет действие над элементами потока.

Пример параллельного потока, упорядоченного по порядку()

Давайте посмотрим, что происходит, когда мы используем для каждого упорядоченного() с параллельным потоком элементов списка.

jshell> List list = List.of(1, 2, 3, 4, 5, 6, 7);
list ==> [1, 2, 3, 4, 5, 6, 7]

jshell> list.parallelStream().forEachOrdered(System.out::println);
1
2
3
4
5
6
7

jshell> 

Ясно, что порядок встреч в потоке сохраняется.

Ссылка