2015-07-29 16 views
21

Quindi ho un Stream<Collection<Long>> che ottengo eseguendo una serie di trasformazioni su un altro stream.Combina flusso di raccolte in una raccolta - Java 8

Quello che devo fare è raccogliere lo Stream<Collection<Long>> in uno Collection<Long>.

io li potevo raccogliere in una lista come questa:

<Stream<Collection<Long>> streamOfCollections = /* get the stream */; 

List<Collection<Long>> listOfCollections = streamOfCollections.collect(Collectors.toList()); 

E poi ho potuto scorrere quella lista di collezioni per combinarle in una sola.

Tuttavia, immagino ci debba essere un modo semplice per combinare lo stream delle raccolte in uno Collection<Long> utilizzando uno .map() o .collect(). Non riesco a pensare a come farlo. Qualche idea?

+2

sguardo nel 'flatMap'. –

risposta

38

Questa funzionalità può essere raggiunto con una chiamata al the flatMap method sul torrente, che prende un Function che mappa l'elemento Stream ad un altro Stream su cui è possibile raccogliere.

Qui, il metodo flatMap converte il Stream<Collection<Long>> ad un Stream<Long>, e collect li raccoglie in un Collection<Long>.

Collection<Long> longs = streamOfCollections 
    .flatMap(coll -> coll.stream()) 
    .collect(Collectors.toList()); 
+12

È anche possibile utilizzare un riferimento al metodo: '.flatMap (Collection :: stream)' –

11

Si potrebbe farlo utilizzando collect e fornendo un fornitore (la parte ArrayList::new):

Collection<Long> longs = streamOfCollections.collect(
    ArrayList::new, 
    ArrayList::addAll, 
    ArrayList::addAll 
); 
+2

Soluzione più performante rispetto a quella che utilizza flatMap() – Desik

+0

@Desik Sicuramente - è ciò che utilizzo in questi giorni. All'epoca stavo solo imparando la nuova API di streaming. –

Problemi correlati