Vous posez la mauvaise question. Vous demandez sequential
plutôt parallel
que vous voulez traiter les articles dans l'ordre , vous devez donc vous renseigner sur la commande . Si vous avez un flux ordonné et effectuez des opérations qui garantissent le maintien de l'ordre, peu importe que le flux soit traité en parallèle ou séquentiel; la mise en œuvre maintiendra l'ordre.
La propriété ordonnée est distincte de parallèle vs séquentielle. Par exemple, si vous appelez stream()
sur un, HashSet
le flux ne sera pas ordonné lors de l'appel stream()
sur un List
renvoie un flux ordonné. Notez que vous pouvez appeler unordered()
pour libérer le contrat de commande et augmenter potentiellement les performances. Une fois que le flux n'a pas de commande, il n'y a aucun moyen de rétablir la commande. (La seule façon de transformer un flux non ordonné en un flux ordonné est d'appeler sorted
, cependant, l'ordre résultant n'est pas nécessairement l'ordre d'origine).
Voir également la section «Commande» de la java.util.stream
documentation du package .
Afin d'assurer le maintien de la commande tout au long d'une opération de flux, vous devez étudier la documentation de la source du flux, toutes les opérations intermédiaires et le fonctionnement du terminal pour savoir si elles maintiennent l'ordre ou non (ou si la source a une commande dans le premier endroit).
Cela peut être très subtil, par exemple, Stream.iterate(T,UnaryOperator)
crée un flux ordonné tout en Stream.generate(Supplier)
créant un flux non ordonné . Notez que vous avez également commis une erreur courante dans votre question car elle ne maintient pas la commande. Vous devez utiliser si vous souhaitez traiter les éléments du flux dans un ordre garanti.forEach
forEachOrdered
Donc, si votre list
dans votre question est effectivement a java.util.List
, sa stream()
méthode retournera un flux ordonné et filter
ne changera pas l'ordre. Donc si vous appelez list.stream().filter() .forEachOrdered()
, tous les éléments seront traités séquentiellement dans l'ordre, alors que pour list.parallelStream().filter().forEachOrdered()
les éléments pourraient être traités en parallèle (par exemple par le filtre) mais l'action du terminal sera toujours appelée dans l'ordre (ce qui réduira évidemment le bénéfice de l'exécution en parallèle) .
Si, par exemple, vous utilisez une opération comme
List<…> result=inputList.parallelStream().map(…).filter(…).collect(Collectors.toList());
toute l'opération peut bénéficier d'une exécution parallèle, mais la liste résultante sera toujours dans le bon ordre, que vous utilisiez un flux parallèle ou séquentiel.
List<>
que la commande sera conservée, mais le fera-Collection<>
t- elle ?Set
s généralement pas, sauf si c'est unSortedSet
ouLinkedHashSet
. Les vues de collecte d'unMap
(keySet()
,entrySet()
etvalues()
) héritent de laMap
politique de, ce sont commandés lorsque la carte est unSortedMap
ouLinkedHashMap
. Le comportement est déterminé par les caractéristiques rapportées par le séparateur de la collection . L'default
implémentation deCollection
ne signale pas laORDERED
caractéristique, elle n'est donc pas ordonnée, sauf si elle est remplacée.forEachOrdered
ne diffère queforEach
lorsque vous utilisez des flux parallèles - mais il est recommandé de l'utiliser quand même lors de la commande, au cas où la méthode de cuisson à la vapeur changerait un jour ...En un mot:
L'ordre dépend de la structure des données source et des opérations de flux intermédiaires. En supposant que vous utilisez un,
List
le traitement doit être ordonné (carfilter
cela ne changera pas la séquence ici).Plus de détails:
Séquentiel vs parallèle vs non ordonné:
Javadocs
Commande de flux:
Javadocs
la source