parallelStream vs stream.parallèle
j'ai été curieux de connaître la différence entre Collections.parallelStream()
et Collections.stream().parallel()
. Selon la documentation Javadoc, parallelStream()
tente de retourner un flux parallèle, alors que stream().parallel()
renvoie un flux parallèle. Par mes propres tests, je n'ai trouvé aucune différence. D'où vient la différence entre ces deux méthodes réside? Une mise en œuvre est-elle plus efficace qu'une autre? Grâce.
2 réponses
Même s'ils agissent de la même pour le moment, il y a une différence - au moins dans leur documentation comme vous l'avez fait remarquer; qui pourrait être exploitée dans le futur autant que je puisse dire.
Au moment de l' parallelStream
méthode est définie dans le Collection
interface:
default Stream<E> parallelStream() {
return StreamSupport.stream(spliterator(), true);
}
étant une méthode par défaut, elle peut être annulée dans les implémentations (et c'est ce que Collections
les classes intérieures le font effectivement).
cela suggère que même si la méthode par défaut renvoie un flux parallèle, il pourrait y avoir des Collections qui outrepassent cette méthode pour retourner un non-parallel Stream
. C'est la raison pour laquelle la documentation est probablement telle qu'elle est.
En même temps mêmeparallelStream
retourne un flux séquentiel - c'est encore un Stream
; et puis vous pouvez facilement appeler parallel
:
Collections.some()
.parallelStream() // actually sequential
.parallel() // force it to be parallel
au moins pour moi, ça a l'air bizarre.
il semble que la documentation devrait d'une façon ou d'une autre indiquer que après avoir appelé parallelStream
il devrait y avoir aucune raison de l'appeler parallel
encore une fois pour forcer que-puisque il pourrait être inutile ou même mauvais pour le traitement.
EDIT
pour ceux qui lisent ceci-s'il vous plaît lire les commentaires de Holger aussi; il couvre les cas au-delà de ce que j'ai dit dans cette réponse.
Il n'y a pas de différence entre Collections.parallelStream()
et Collections.stream().parallel()
. Ils diviseront le flux dans la mesure où le spliterator sous-jacent le permettra, et ils s'exécuteront tous les deux en utilisant le ForkJoinPool par défaut (à moins qu'il ne s'exécute déjà dans un autre).