如何从已有不可变集合创建含新增元素的新不可变集合?
解决不可变集合合并新增元素的问题
你之前用Set.of(s, "d")得到嵌套集合,是因为这个方法把原集合对象和字符串"d"当作两个独立元素存入了新集合,而非合并元素。下面提供两种无需Guava的解决方案:
方法一:借助可变集合过渡
先将不可变集合转为可变集合(比如HashSet),添加新元素后再转回不可变集合:
Set<String> s = Set.of("a", "b", "c"); // 创建可变集合并导入原集合元素 Set<String> mutableSet = new HashSet<>(s); mutableSet.add("d"); // 转换为新的不可变集合 Set<String> newImmutableSet = Set.copyOf(mutableSet);
Set.copyOf()会返回包含可变集合所有元素的不可变集合,同时自动忽略重复元素。
方法二:使用Stream流合并(Java 10+)
通过Stream将原集合元素和新元素合并,直接收集为不可变集合:
Set<String> s = Set.of("a", "b", "c"); Set<String> newImmutableSet = Stream.concat(s.stream(), Stream.of("d")) .collect(Collectors.toUnmodifiableSet());
Collectors.toUnmodifiableSet()返回符合Set规范的不可变集合,无需借助中间可变集合,代码更简洁。
两种方法都不会修改原不可变集合s,而是生成一个全新的不可变集合。
内容的提问来源于stack exchange,提问作者akonsu
相关产品推荐
相关产品推荐

