Подтвердить что ты не робот

Объединить поток коллекций в одну коллекцию - 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(). Я просто не могу придумать, как это сделать. Любые идеи?

4b9b3361

Ответ 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, тогда вам также нужно редактировать только одну строку.