You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不修改原集合,用简洁语法实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:18:22