我想说我想计算2套set1
和set2
的并集,并将结果分配给set3
。我不想更改set1
和set2
的值。
我知道我可以这样做:
Set<String> set1 = new HashSet<String>(); set1.add("a");
Set<String> set2 = new HashSet<String>(); set2.add("b");
Set<String> set3 = new HashSet<String>(set1); // copy constructor
set3.addAll(set2);
但我想知道是否有更直接的语法:
Set<String> set3 = (new HashSet<String>(set1)).addAll(set2);
或
Set<String> set3 = new HashSet<String>();
set3.addAll(set1).addAll(set2);
我试过的方法不起作用,因为addAll()
返回一个布尔值,而不是结果Set对象。
答案 0 :(得分:3)
目前还不完全清楚你的标准是什么,但这里有另一种选择:
Set<String> set3 = Stream.concat(set1.stream(), set2.stream())
.collect(Collectors.toSet());
如果你正在使用番石榴,你也可以这样做:
Set<String> set3 = Sets.union(set1, set2);
请注意,这实际上会返回视图。对基础集的后续修改将反映在set3
中。如果您需要不可变副本,可以使用ImmutableSet
:
Set<String> set3 = new ImmutableSet.Builder<String>()
.addAll(set1)
.addAll(set2)
.build();
答案 1 :(得分:3)
另一种方法是:
Set<String> set3 = Stream.of(set1, set2)
.flatMap(Collection::stream)
.collect(Collectors.toSet());
答案 2 :(得分:1)
在Java 8中
Set<String> set3 = Stream.concat(set1.stream(), set2.stream())
.collect(Collectors.toSet());
和Java 9
Set<String> set4 = Set.of(set1, set2).stream()
.flatMap(Collection::stream).collect(Collectors.toSet());
此外,还有一个匿名类的技巧 (正如@shmosel在评论中所说,这不是好的解决方案)
Set<String> set5 = new HashSet<>() {{
addAll(set1);
addAll(set2);
}};