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.