我有一个Set<Integer>
可能包含许多元素的不可变集合(转换为 a )。我需要一个包含该集合中的元素和一个附加元素的集合。我有 kludgy 代码来复制集合,然后附加元素,但我正在寻找使事情尽可能高效的正确方法。
我有 Guava 可用,但我不需要使用它。
不确定性能,但您可以使用 Guava 的ImmutableSet.Builder
:
import com.google.common.collect.ImmutableSet
// ...
Set<Integer> newSet = new ImmutableSet.Builder<Integer>()
.addAll(oldSet)
.add(3)
.build();
当然,您也可以为此编写一个辅助方法:
public static <T> Set<T> setWith(Set<T> old, T item) {
return new ImmutableSet.Builder<T>().addAll(old).add(item).build();
}
// ...
Set<Integer> newSet = setWith(oldSet, 3);
使用 Java 8,您还可以使用流来实现该效果
Stream.concat(oldSet.stream(),
Stream.of(singleElement))
.collect(Collectors.toSet())
顺便说一句,从 JDK 10 开始,Collectors
还允许累积到不可变类型(与静态工厂创建的类型相同Set.of()
):
Stream.concat(oldSet.stream(),
Stream.of(singleElement))
.collect(Collectors.toUnmodifiableSet())
你可以考虑 Sets.union()。建设会更快,但使用更慢。
public static <T> Set<T> setWith(Set<T> old, T item) {
return Sets.union(old, Collections.singleton(item);
}
(com.google.common.collect.Sets & java.util.Collections)
如果 Set 是不可变的,除了复制 Set,然后添加新元素之外,我看不到任何其他方法。请记住,复制一个集合就像在创建新集合时将基本集合传递给构造函数一样简单。
你有三个选择。
有时 aBitSet
是比Set<Integer>
取决于您的值的分布更好的选择。
当我在同一个句子中阅读“不可变”和“添加到”时,我正在经历认知失调。您可以将新元素添加到不可变值的可变副本的末尾,但不能修改不可变集。我不知道有什么优雅的。