J'ai du mal à comprendre l' Stream
interface de Java 8, en particulier lorsqu'il s'agit de Spliterator
etCollector
interfaces . Mon problème est que je ne peux tout simplement pas comprendre Spliterator
et les Collector
interfaces encore, et par conséquent, l' Stream
interface est encore quelque peu obscure pour moi.
Qu'est-ce qu'un Spliterator
et unCollector
, et comment puis-je les utiliser? Si je suis prêt à écrire le mien Spliterator
ou Collector
(et probablement le mien Stream
dans ce processus), que dois-je faire et ne pas faire?
J'ai lu quelques exemples éparpillés sur le Web, mais comme tout ici est encore nouveau et sujet à modifications, les exemples et les tutoriels sont encore très rares.
la source
Collectors.of
ancienne méthode de version bêta a été supprimée ou est-ce que je manque quelque chose? Par souci d'exhaustivité,(x,y) -> x+y
peut s'écrireInteger::sum
.Spliterator
signifie essentiellement «itérateur fractionnable».Un seul thread peut traverser / traiter tout le Spliterator lui-même, mais le Spliterator a également une méthode
trySplit()
qui "scindera" une section pour quelqu'un d'autre (généralement, un autre thread) à traiter - laissant le spliterator actuel avec moins de travail.Collector
combine la spécification d'unereduce
fonction (de renommée de réduction de la carte), avec une valeur initiale, et une fonction pour combiner deux résultats (permettant ainsi de combiner les résultats de flux de travail Spliterated).Par exemple, le collecteur le plus basique aurait une valeur initiale de 0, ajouterait un entier à un résultat existant et «combinerait» deux résultats en les ajoutant. Additionnant ainsi un flux fractionné d'entiers.
Voir:
Spliterator.trySplit()
Collector<T,A,R>
la source
Voici des exemples d'utilisation des collecteurs prédéfinis pour effectuer des tâches de réduction mutable courantes:
la source
Interface
Spliterator
- est une fonctionnalité principale de Streams .Les méthodes
stream()
etparallelStream()
par défaut sont présentées dans l'Collection
interface. Ces méthodes utilisent le Spliterator via l'appel àspliterator()
:Spliterator est un itérateur interne qui divise le flux en parties plus petites. Ces petites pièces peuvent être traitées en parallèle.
Parmi les autres méthodes, il y a deux plus importantes pour comprendre le Spliterator:
boolean tryAdvance(Consumer<? super T> action)
Contrairement auIterator
, il essaie d'effectuer l'opération avec l'élément suivant. Si l'opération s'est exécutée avec succès, la méthode retournetrue
. Sinon, renvoiefalse
- cela signifie qu'il y a absence d'élément ou de fin de flux.Spliterator<T> trySplit()
Cette méthode permet de diviser un ensemble de données en plusieurs ensembles plus petits selon l'un ou l'autre des critères (taille du fichier, nombre de lignes, etc.).la source