web-dev-qa-db-fra.com

Combinez le flux de collections en une collection - Java 8

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?

30
Andrew Mairose

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());
55
rgettman

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
);
12
Vivin Paliath

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.

0
Helmut Provost