Sie stellen die falsche Frage. Sie fragen nach sequential
vs., parallel
während Sie Artikel in der richtigen Reihenfolge bearbeiten möchten , also müssen Sie nach der Bestellung fragen . Wenn Sie einen bestellten Stream haben und Vorgänge ausführen, die die Aufrechterhaltung der Reihenfolge gewährleisten, spielt es keine Rolle, ob der Stream parallel oder sequentiell verarbeitet wird. Die Implementierung wird die Reihenfolge beibehalten.
Die geordnete Eigenschaft unterscheidet sich von parallel und sequentiell. Zum Beispiel , wenn Sie rufen stream()
auf einen HashSet
wird der Strom ungeordneten seine beim Aufruf stream()
auf einer List
Rückkehr eines geordnete Strom. Beachten Sie, dass Sie anrufen können unordered()
, um den Bestellvertrag freizugeben und möglicherweise die Leistung zu steigern. Sobald der Stream keine Bestellung mehr hat, kann die Bestellung nicht mehr wiederhergestellt werden. (Die einzige Möglichkeit, einen ungeordneten Stream in einen geordneten zu verwandeln, besteht darin, aufzurufen sorted
. Die resultierende Bestellung ist jedoch nicht unbedingt die ursprüngliche Bestellung.)
Siehe auch den Abschnitt „Bestellung“ in der java.util.stream
Paketdokumentation .
Um die Aufrechterhaltung der Bestellung während eines gesamten Stream-Vorgangs sicherzustellen, müssen Sie die Dokumentation der Stream-Quelle, aller Zwischenvorgänge und des Terminal-Vorgangs dahingehend untersuchen, ob sie den Auftrag aufrechterhalten oder nicht (oder ob die Quelle im ersten einen Auftrag hat Ort).
Dies kann sehr subtil sein, z. B. Stream.iterate(T,UnaryOperator)
wird ein geordneter Stream Stream.generate(Supplier)
erstellt, während ein ungeordneter Stream erstellt wird. Beachten Sie, dass Sie in Ihrer Frage auch einen häufigen Fehler gemacht haben, da die Bestellung nicht beibehalten wird. Sie müssen verwenden, wenn Sie die Elemente des Streams in einer garantierten Reihenfolge verarbeiten möchten.forEach
forEachOrdered
Wenn es sich list
bei Ihrer Frage also tatsächlich um eine handelt java.util.List
, gibt die stream()
Methode einen bestellten Stream zurück und filter
ändert die Reihenfolge nicht. Wenn Sie also aufrufen list.stream().filter() .forEachOrdered()
, werden alle Elemente der Reihe nach nacheinander verarbeitet, während list.parallelStream().filter().forEachOrdered()
die Elemente möglicherweise parallel verarbeitet werden (z. B. durch den Filter), die Terminalaktion jedoch weiterhin in der Reihenfolge aufgerufen wird (was offensichtlich den Vorteil der parallelen Ausführung verringert). .
Wenn Sie beispielsweise eine Operation wie verwenden
List<…> result=inputList.parallelStream().map(…).filter(…).collect(Collectors.toList());
Der gesamte Vorgang kann von einer parallelen Ausführung profitieren, die resultierende Liste ist jedoch immer in der richtigen Reihenfolge, unabhängig davon, ob Sie einen parallelen oder einen sequentiellen Stream verwenden.
List<>
wird die Ordnung erhalten, aber wirdCollection<>
?Set
s normalerweise nicht, es sei denn, es ist einSortedSet
oderLinkedHashSet
. Die Sammlung Ansichten einesMap
(keySet()
,entrySet()
, undvalues()
) erbt dieMap
Politik s‘, das heißt geordnet , wenn die Karte eine istSortedMap
oderLinkedHashMap
. Das Verhalten wird durch die vom Spliterator der Sammlung gemeldeten Merkmale bestimmt . Diedefault
Implementierung vonCollection
meldet dasORDERED
Merkmal nicht, daher ist es ungeordnet, sofern es nicht überschrieben wird.forEachOrdered
nur von derforEach
Verwendung paralleler Streams unterscheidet. Es empfiehlt sich jedoch, diese bei der Bestellung zu verwenden, falls sich die Dampfmethode jemals ändert ...In einer Nussschale:
Die Reihenfolge hängt von der Quelldatenstruktur und den Zwischenstromoperationen ab. Angenommen, Sie verwenden eine, sollte
List
die Verarbeitung bestellt werden (dafilter
hier die Reihenfolge nicht geändert wird).Mehr Details:
Sequentiell vs Parallel vs Ungeordnet:
Javadocs
Stream-Bestellung:
Javadocs
quelle