如何使用java stream合并集合?

iswrvxsc  于 2023-01-07  发布在  Java
关注(0)|答案(3)|浏览(364)

我有两个这样的Set

Set<String> set1;
Set<String> set2;

我想把它们和

Set<String> s = Stream.of(set1, set2).collect(Collectors.toSet());

但我得到了以下错误:
不存在类型变量的示例,因此Set<String>符合String
推理变量T具有不兼容的界限:
等式约束:String下限:Set<String>

如何将Set转换为具有flatMap()的单个Set<String>?是否有其他解决方案可以优雅地完成此操作?

jv2fixgn

jv2fixgn1#

如果你坚持使用Stream,你可以使用flatMap把你的Stream<Set<String>>转换成一个Stream<String>,它可以被收集到一个Set<String>中:

Set<String> s = Stream.of(set1, set2).flatMap(Set::stream).collect(Collectors.toSet());
insrf1ej

insrf1ej2#

您可以使用Stream.concat合并两个集合的流,并按集合进行收集。

Set<String> s = Stream.concat(set1.stream(), set2.stream()).collect(Collectors.toSet());
dxxyhpgq

dxxyhpgq3#

有几种可能的方法-

合并

Set<String> s = Stream.concat(set1.stream(), set2.stream()).collect(Collectors.toSet());

因为我们必须写入,所以对于超过2个流,它会变得稍微难看

Stream.concat(Stream.concat(set1.stream(), set2.stream()), set3.stream())

Concat对于深度连接流可能是个问题。来自文档-

从重复串联构造流时要小心。访问深度串联流的元素可能会导致深度调用链,甚至StackOverflowException。

减少

Reduce还可用于执行流的连接,如-

Set<String> s = Stream.of(set1.stream(), set2.stream()).reduce(Stream::concat)
  .orElseGet(Stream::empty).collect(Collectors.toSet());

这里Stream.reduce()返回可选的,这就是orElseGet方法调用的原因。也可以联系多个集合,如

Stream.of(set1.stream(), set2.stream(), set2.stream()).reduce(Stream::concat).orElseGet(Stream::empty).collect(Collectors.toSet());

与深度接触流相关的问题也适用于减少

平面图

平面图可用于获得与以下相同的结果-

Set<String> s = Stream.of(set1, set2).flatMap(Set::stream).collect(Collectors.toSet());

要连接多个流,可以使用-

Set<String> s = Stream.of(set1, set2, set3).flatMap(Set::stream).collect(Collectors.toSet());

平面Map避免了StackOverflowException

相关问题