将集合流合并到一个集合中 - Java 8

时间:2015-07-29 16:58:51

标签: java collections java-8 java-stream

所以我通过在另一个流上进行一系列转换来获得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()。我只是想不出怎么做。有什么想法吗?

3 个答案:

答案 0 :(得分:50)

可以通过调用流上的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());

答案 1 :(得分:12)

您可以使用collect并提供供应商(ArrayList::new部分)来执行此操作:

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

答案 2 :(得分:0)

不需要时不需要指定类。 更好的解决方案是:

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

说,您不需要ArrayList但需要HashSet,那么您还只需要编辑一行。