Автор оригинала: Pankaj Kumar.
- Java Stream forEach() и forEachOrdered() являются терминальными операциями.
- Метод forEach() используется для выполнения действия над каждым элементом потока.
- Если метод forEach() используется с параллельным потоком, порядок встреч не поддерживается. Действие будет выполнено над каждым элементом, но их порядок не будет фиксирован.
- Если вы хотите выполнить какое-либо действие с элементами потока в порядке встреч, вам следует использовать метод forEachOrdered ().
- Базовая коллекция должна иметь порядок встреч, иначе для каждого упорядоченного() не сможет это соблюдать. Поэтому использовать его с набором деревьев или картой деревьев бесполезно.
- Действие forEachOrdered() выполняется для каждого элемента потока по одному, поэтому оно немного медленнее, чем метод forEach ().
- Использование для каждого упорядоченного() в параллельном потоке не обеспечивает преимуществ параллельного потока, поэтому его использование с параллельным потоком не имеет большого смысла.
Подпись методов Java Stream forEach() и forEachOrdered()
void forEach(Consumer super T> action) void forEachOrdered(Consumer<? super T> action);
Потребитель
представляет собой Функциональный интерфейс . Он представляет собой операцию, которая принимает один входной аргумент и не возвращает результата.
Пример Stream forEach()
Давайте рассмотрим простой пример для печати всех элементов потока.
jshell> StreamstreamNumbers = 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> Listlist = 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> Listlist = 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>
Ясно, что порядок встреч в потоке сохраняется.