直接赋值`set1.addAll(set2)`的结果集

时间:2018-05-17 21:37:41

标签: java

我想说我想计算2套set1set2的并集,并将结果分配给set3。我不想更改set1set2的值。

我知道我可以这样做:

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对象。

3 个答案:

答案 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);
}};