有几种可能的方法-
连接
Set<String> s = Stream.concat(set1.stream(), set2.stream()).collect(Collectors.toSet());
因为我们必须编写超过 2 个流,所以它有点难看
Stream.concat(Stream.concat(set1.stream(), set2.stream()), set3.stream())
连接可能是深度连接流的问题。来自文档 -
从重复构造流时要小心
连接。访问深度连接流的元素可以
导致深度调用链,甚至 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());
与深度接触流相关的问题也适用于 reduce
平面图
Flatmap 可用于获得与 -
相同的结果
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());
平面图避免StackOverflowException。