Você está fazendo a pergunta errada. Você está perguntando sobre sequential
vs., parallel
enquanto deseja processar os itens em ordem , portanto, é necessário perguntar sobre pedidos . Se você possui um fluxo ordenado e realiza operações que garantem manter o pedido, não importa se o fluxo é processado em paralelo ou sequencialmente; a implementação manterá a ordem.
A propriedade ordenada é distinta de paralela e seqüencial. Por exemplo, se você chamar stream()
um HashSet
fluxo, não será ordenado ao chamar stream()
um List
retorno de um fluxo ordenado. Observe que você pode ligar unordered()
para liberar o contrato de pedido e potencialmente aumentar o desempenho. Uma vez que o fluxo não tem pedidos, não há como restabelecer o pedido. (A única maneira de transformar um fluxo não ordenado em um ordenado é chamar sorted
, no entanto, o pedido resultante não é necessariamente o pedido original).
Consulte também a seção "Pedidos" da java.util.stream
documentação do pacote .
Para garantir a manutenção do pedido em toda uma operação de fluxo, você deve estudar a documentação da fonte do fluxo, todas as operações intermediárias e a operação do terminal para manter ou não o pedido (ou se a fonte tem um pedido no primeiro Lugar, colocar).
Isso pode ser muito sutil, por exemplo, Stream.iterate(T,UnaryOperator)
cria um fluxo ordenado enquanto Stream.generate(Supplier)
cria um fluxo não ordenado . Observe que você também cometeu um erro comum em sua pergunta, pois não mantém a ordem. Você precisa usar se quiser processar os elementos do fluxo em uma ordem garantida.forEach
forEachOrdered
Portanto, se a list
sua pergunta for de fato a java.util.List
, o stream()
método retornará um fluxo ordenado e filter
não alterará a ordem. Portanto, se você chamar list.stream().filter() .forEachOrdered()
, todos os elementos serão processados sequencialmente em ordem, enquanto list.parallelStream().filter().forEachOrdered()
os elementos podem ser processados em paralelo (por exemplo, pelo filtro), mas a ação do terminal ainda será chamada em ordem (o que obviamente reduzirá o benefício da execução paralela) .
Se você, por exemplo, usar uma operação como
List<…> result=inputList.parallelStream().map(…).filter(…).collect(Collectors.toList());
a operação inteira pode se beneficiar da execução paralela, mas a lista resultante sempre estará na ordem correta, independentemente de você usar um fluxo paralelo ou sequencial.