如果您正在寻找最紧凑的初始化集合的方法,那就是Java9:
Set<String> strSet = Set.of("Apple", "Ball", "Cat", "Dog");
======================下面详细解答======================= ===
使用 Java 10(不可修改集)
Set<String> strSet1 = Stream.of("A", "B", "C", "D")
.collect(Collectors.toUnmodifiableSet());
这里的收集器实际上会返回 Java 9 中引入的不可修改集合,从源代码中的语句 set -> (Set<T>)Set.of(set.toArray()) 可以看出。
需要注意的一点是Collections.unmodifiableSet() 方法返回指定集合的不可修改视图(根据文档)。 不可修改的视图 集合是不可修改的集合,也是支持集合的视图。请注意,对支持集合的更改可能仍然是可能的,如果它们发生,它们通过不可修改的视图可见。但是 Collectors.toUnmodifiableSet() 方法返回 真正不可变 在 Java 10 中设置。
使用 Java 9(不可修改集)
以下是初始化集合的最简洁的方式:
Set<String> strSet6 = Set.of("Apple", "Ball", "Cat", "Dog");
我们有这个 convenience factory 方法的 12 个重载版本:
static <E> Set<E> of()
static <E> Set<E> of(E e1)
static <E> Set<E> of(E e1, E e2)
// ....等等
static <E> Set<E> of(E... elems)
那么一个自然的问题是当我们有 var-args 时为什么我们需要重载版本?答案是:每个 var-arg 方法都会在内部创建一个数组,并且拥有重载的版本可以避免不必要的对象创建,也可以让我们避免垃圾回收的开销。
使用 Java 8(可修改集)
在 Java 8 中使用 Stream。
Set<String> strSet1 = Stream.of("A", "B", "C", "D")
.collect(Collectors.toCollection(HashSet::new));
// stream from an array (String[] stringArray)
Set<String> strSet2 = Arrays.stream(stringArray)
.collect(Collectors.toCollection(HashSet::new));
// stream from a list (List<String> stringList)
Set<String> strSet3 = stringList.stream()
.collect(Collectors.toCollection(HashSet::new));
使用 Java 8(不可修改集)
使用 Collections.unmodifiableSet()
我们可以使用Collections.unmodifiableSet()作为:
Set<String> strSet4 = Collections.unmodifiableSet(strSet1);
但是看起来有点别扭,我们可以这样写我们自己的收集器:
class ImmutableCollector {
public static <T> Collector<T, Set<T>, Set<T>> toImmutableSet() {
return Collector.of(HashSet::new, Set::add, (l, r) -> {
l.addAll(r);
return l;
}, Collections::unmodifiablSet);
}
}
然后将其用作:
Set<String> strSet4 = Stream.of("A", "B", "C", "D")
.collect(ImmutableCollector.toImmutableSet());
使用 Collectors.collectingAndThen()
另一种方法是使用方法Collectors.collectingAndThen(),它可以让我们执行额外的整理转换:
import static java.util.stream.Collectors.*;
Set<String> strSet5 = Stream.of("A", "B", "C", "D").collect(collectingAndThen(
toCollection(HashSet::new),Collections::unmodifiableSet));
如果我们只关心Set,那么我们也可以使用Collectors.toSet() 代替Collectors.toCollection(HashSet::new)。
同时检查 this 对 Java 8 的回答。