2015-07-29 13 views
21

Mam więc Stream<Collection<Long>>, którą otrzymuję wykonując serię transformacji w innym strumieniu.Połącz strumień kolekcji w jedną kolekcję - Java 8

Co muszę zrobić, to zebrać Stream<Collection<Long>> w jeden Collection<Long>.

mogłem zebrać je wszystkie do listy tak:

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

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

I wtedy mógłby iterację tej liście kolekcji, aby połączyć je w jedno.

jednak sobie wyobrazić, że musi być w prosty sposób łączyć strumień zbiorów w jeden Collection<Long> użyciu .map() lub .collect(). Po prostu nie mogę wymyślić, jak to zrobić. Jakieś pomysły?

+2

zajrzeć do 'flatMap'. –

Odpowiedz

38

Ta funkcjonalność można osiągnąć przy wywołaniu the flatMap method w strumieniu, który odbywa się Function który mapuje element do innego Stream na których można zbierać Stream.

Tutaj metoda flatMap konwertuje Stream<Collection<Long>> do Stream<Long> i collect zbiera je w Collection<Long>.

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

Można również użyć odwołania do metody: '.flatMap (Collection :: stream)' –

11

Można to zrobić za pomocą collect i zapewniając dostawcę (The ArrayList::new część):

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

Rozwiązanie bardziej wydajne niż przy użyciu flatMap() – Desik

+0

@Desik Zdecydowanie - właśnie tego używam. W tym czasie właśnie uczyłem się nowego API strumieniowania. –