J'ai donc un Stream<Collection<Long>>
Que j'obtiens en faisant une série de transformations sur un autre stream.
Ce que je dois faire, c'est rassembler le Stream<Collection<Long>>
En un Collection<Long>
.
Je pourrais tous les rassembler dans une liste comme celle-ci:
<Stream<Collection<Long>> streamOfCollections = /* get the stream */;
List<Collection<Long>> listOfCollections = streamOfCollections.collect(Collectors.toList());
Et puis je pourrais parcourir cette liste de collections pour les combiner en une seule.
Cependant, j'imagine qu'il doit y avoir un moyen simple de combiner le flux de collections en un seul Collection<Long>
En utilisant une .map()
ou .collect()
. Je n'arrive pas à penser à comment le faire. Des idées?
Cette fonctionnalité peut être obtenue avec un appel à la méthode flatMap
sur le flux, qui prend un Function
qui mappe l'élément Stream
à un autre Stream
sur lequel vous pouvez collecter.
Ici, la méthode flatMap
convertit le Stream<Collection<Long>>
à un Stream<Long>
et collect
les recueille dans un Collection<Long>
.
Collection<Long> longs = streamOfCollections
.flatMap( coll -> coll.stream())
.collect(Collectors.toList());
Vous pouvez le faire en utilisant collect
et en fournissant un fournisseur (le ArrayList::new
partie):
Collection<Long> longs = streamOfCollections.collect(
ArrayList::new,
ArrayList::addAll,
ArrayList::addAll
);
Vous n'avez pas besoin de spécifier des classes lorsqu'elles ne sont pas nécessaires. Une meilleure solution est:
Collection<Long> longs = streamOfCollections.collect(
ArrayList::new,
Collection::addAll,
Collection::addAll
);
Disons, vous n'avez pas besoin d'une ArrayList mais avez besoin d'un HashSet, alors vous devez également modifier une seule ligne.