java - 直接赋值 `set1.addAll(set2)`的结果Set

标签 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() 返回一个 boolean 值,而不是结果集对象。

最佳答案

目前还不完全清楚您的标准是什么,但这里有一个替代方案:

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

如果你使用的是 Guava,你也可以这样做:

Set<String> set3 = Sets.union(set1, set2);

请注意,这实际上返回了一个 View 。对基础集合的后续修改将反射(reflect)在 set3 中。如果你想要一个不可变的副本,你可以使用ImmutableSet:

Set<String> set3 = new ImmutableSet.Builder<String>()
        .addAll(set1)
        .addAll(set2)
        .build();

关于java - 直接赋值 `set1.addAll(set2)`的结果Set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50400860/

相关文章:

java - 由于没有 session ,未能延迟初始化集合

java - 使用Bouncy CaSTLe从android中提取证书信息

java - 使用 .so 文件构建 Ant

java - 自动识别Pitest中哪些测试用例杀死了哪些突变体

java - 使用 AssertJ,如何对列表的内容执行复杂的断言?

java - 使用private指定类的访问控制

java - 在 JAVA 中创建对象列表

java - 如何在 Spring WebApplicationContext 中在运行时添加 bean 实例?

java - Android添加n个文本字段

java:运行时相当于数字类型之间的转换