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.

12
demandé sur Nick Clark 2017-05-05 20:59:21

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.

7
répondu Eugene 2017-05-08 20:53:22

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).

3
répondu Joe C 2017-05-05 22:21:55