2015-07-29 2 views
21

Итак, у меня есть Stream<Collection<Long>>, который я получаю, выполняя ряд преобразований в другом потоке.Объединить поток коллекций в одну коллекцию - Java 8

Что мне нужно сделать, это собрать Stream<Collection<Long>> в один Collection<Long>.

Я мог бы собрать их всех в список, как это:

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

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

И тогда я мог бы перебирать этот список коллекций, чтобы объединить их в одно целое.

Однако я полагаю, что должен быть простой способ объединить поток коллекций в один Collection<Long> с использованием .map() или .collect(). Я просто не могу придумать, как это сделать. Есть идеи?

+2

Посмотрите в 'flatMap'. –

ответ

38

Эта функциональность может быть достигнута с помощью вызова the flatMap method на поток, который принимает Function, переводящий Stream пункта к другому Stream, на котором вы можете собрать.

Здесь метод flatMap преобразует Stream<Collection<Long>> к Stream<Long> и collect собирает их в Collection<Long>.

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

Вы также можете использовать ссылку на метод: '.flatMap (Collection :: stream)' –

11

Вы могли бы сделать это с помощью collect и обеспечения поставщика (ArrayList::new часть):

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

Более эффективное решение, чем приложение, использующее flatMap() – Desik

+0

@Desik. Определенно - это то, что я использую в эти дни. В то время я просто изучал новый потоковый API. –

Смежные вопросы