如何不修改原集合,用简洁语法实现Set集合的并集赋值?
简洁实现两个Set的并集(不修改原集合)
你提的这个问题很常见——想简洁地合并两个Set又不改动原集合,你的两种尝试之所以失败,核心原因就是addAll()方法返回的是boolean类型(用来表示是否有元素被成功添加),而不是修改后的Set对象本身,所以没法直接赋值给set3。
下面给你几种更简洁的实现方式,适配不同的Java版本和场景:
1. Java 8+:使用Stream API
这是原生Java里最简洁的写法之一,不需要额外依赖:
Set<String> set1 = new HashSet<>(); set1.add("a"); Set<String> set2 = new HashSet<>(); set2.add("b"); // 基础写法,返回通用Set实现(通常是HashSet) Set<String> set3 = Stream.concat(set1.stream(), set2.stream()) .collect(Collectors.toSet()); // 如果需要明确指定为HashSet(比如要后续修改) Set<String> set3 = Stream.concat(set1.stream(), set2.stream()) .collect(Collectors.toCollection(HashSet::new));
这种方式完全不会修改set1和set2,直接生成一个新的集合。
2. Java 10+:利用Set.copyOf简化初始化
如果你用的是Java 10或更高版本,可以结合不可变集合的拷贝方法来简化:
Set<String> set3 = new HashSet<>(Set.copyOf(set1)); set3.addAll(set2);
Set.copyOf()会创建一个原集合的不可变拷贝,再用它初始化新的HashSet,同样不会影响原集合。
3. 第三方库(比如Guava):直接调用工具方法
如果你项目里已经引入了Guava库,它提供了现成的并集工具方法,写法非常直观:
import com.google.common.collect.Sets; Set<String> set3 = Sets.union(set1, set2);
注意:Sets.union()返回的是一个视图(它会关联原集合,原集合变化时视图也会变化)。如果需要一个独立的、不可修改的并集,可以调用:
Set<String> set3 = Sets.union(set1, set2).immutableCopy();
如果需要可变的集合,就把视图转成HashSet:
Set<String> set3 = new HashSet<>(Sets.union(set1, set2));
总结
如果不想引入第三方库,Java 8的Stream API是最推荐的简洁写法;如果用了Guava,Sets.union()能让代码可读性拉满。所有这些方法都不会修改原有的set1和set2,完全符合你的需求。
内容的提问来源于stack exchange,提问作者wisbucky
相关产品推荐
相关产品推荐

