Stai facendo la domanda sbagliata. Stai chiedendo di sequential
vs. parallel
mentre vuoi elaborare gli articoli in ordine , quindi devi chiedere di ordinare . Se hai un ordine flusso ed esegui operazioni che garantiscono di mantenere l'ordine, non importa se il flusso viene elaborato in parallelo o in sequenza; l'implementazione manterrà l'ordine.
La proprietà ordinata è distinta dal parallelo rispetto al sequenziale. Ad esempio, se si chiama stream()
in un HashSet
torrente sarà ordinata durante la chiamata stream()
su un List
restituisce un flusso ordinato. Si noti che è possibile chiamare unordered()
per rilasciare il contratto di ordinazione e potenzialmente aumentare le prestazioni. Se lo stream non ha alcun ordine, non è possibile ristabilire l'ordine. (L'unico modo per trasformare un flusso non ordinato in un ordine è quello di chiamare sorted
, tuttavia, l'ordine risultante non è necessariamente l'ordine originale).
Vedi anche la sezione "Ordinazione" della java.util.stream
documentazione del pacchetto .
Al fine di garantire la manutenzione dell'ordine durante un'intera operazione di flusso, è necessario studiare la documentazione della fonte del flusso, tutte le operazioni intermedie e l'operazione del terminale per verificare se mantengono l'ordine o meno (o se la fonte ha un ordine nel primo posto).
Questo può essere molto sottile, ad esempio Stream.iterate(T,UnaryOperator)
crea uno stream ordinato mentre Stream.generate(Supplier)
crea uno stream non ordinato . Si noti che anche hai fatto un errore comune nella sua domanda, come non lo faforEach
mantiene l'ordine. Devi utilizzare forEachOrdered
se desideri elaborare gli elementi del flusso in un ordine garantito.
Quindi se la list
tua domanda è davvero a java.util.List
, il suo stream()
metodo restituirà un flusso ordinato efilter
non cambierà l'ordinamento. Quindi, se chiami list.stream().filter() .forEachOrdered()
, tutti gli elementi verranno elaborati in sequenza in ordine, mentre per list.parallelStream().filter().forEachOrdered()
gli elementi potrebbero essere elaborati in parallelo (ad esempio dal filtro) ma l'azione terminale verrà comunque chiamata in ordine (il che ovviamente ridurrà il beneficio dell'esecuzione in parallelo) .
Se, ad esempio, usi un'operazione come
List<…> result=inputList.parallelStream().map(…).filter(…).collect(Collectors.toList());
l'intera operazione potrebbe trarre vantaggio dall'esecuzione parallela, ma l'elenco risultante sarà sempre nell'ordine corretto, indipendentemente dal fatto che si usi un flusso parallelo o sequenziale.