Объединить поток коллекций в одну коллекцию - Java 8
Итак, у меня есть Stream<Collection<Long>>
, который я получаю, выполняя ряд преобразований в другом потоке.
Что мне нужно сделать, это собрать Stream<Collection<Long>>
в один Collection<Long>
.
Я мог бы собрать их все в список, подобный этому:
<Stream<Collection<Long>> streamOfCollections = /* get the stream */;
List<Collection<Long>> listOfCollections = streamOfCollections.collect(Collectors.toList());
И затем я мог бы перебирать список списков, чтобы объединить их в один.
Однако я полагаю, что должен быть простой способ объединить поток коллекций в один Collection<Long>
с помощью .map()
или .collect()
. Я просто не могу придумать, как это сделать. Любые идеи?
Ответы
Ответ 1
Эта функция может быть достигнута при вызове метода flatMap
в потоке, который принимает Function
, который отображает элемент Stream
в другой Stream
, на который вы можете собрать.
Здесь метод flatMap
преобразует Stream<Collection<Long>>
в Stream<Long>
, а collect
собирает их в Collection<Long>
.
Collection<Long> longs = streamOfCollections
.flatMap( coll -> coll.stream())
.collect(Collectors.toList());
Ответ 2
Вы можете сделать это, используя collect
и предоставив поставщика (часть ArrayList::new
):
Collection<Long> longs = streamOfCollections.collect(
ArrayList::new,
ArrayList::addAll,
ArrayList::addAll
);
Ответ 3
Вам не нужно указывать классы, когда они не нужны. Лучшее решение:
Collection<Long> longs = streamOfCollections.collect(
ArrayList::new,
Collection::addAll,
Collection::addAll
);
Скажем, вам не нужен ArrayList, но нужен HashSet, тогда вам также нужно редактировать только одну строку.