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.
List<>
preservará a ordem, mas seráCollection<>
?Set
s geralmente não, a menos que seja umSortedSet
ouLinkedHashSet
. Os pontos de vista de cobrança de umMap
(keySet()
,entrySet()
evalues()
) herdar aMap
política de 's, ou seja, são ordenados quando o mapa é umSortedMap
ouLinkedHashMap
. O comportamento é determinado pelas características relatadas pelo separador da coleção . Adefault
implementação deCollection
não relata aORDERED
característica, portanto não é ordenada, a menos que seja substituída.forEachOrdered
difere apenas aoforEach
usar fluxos paralelos - mas é uma boa prática usá-lo de qualquer maneira ao fazer pedidos, caso o método de vapor sempre mude ...Em poucas palavras:
A ordem depende da estrutura de dados de origem e das operações de fluxo intermediário. Supondo que você esteja usando um,
List
o processamento deve ser solicitado (jáfilter
que não mudará a sequência aqui).Mais detalhes:
Sequencial vs Paralelo vs Não Ordenado:
Javadocs
Ordenação de stream:
Javadocs
fonte