本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看活动链接
如何通过构造初始化HashSet值?
我需要Set使用初始值创建一个。
Set<String> h = new HashSet<String>();
h.add("a");
h.add("b");
复制代码
有没有办法在一行代码中做到这一点?例如,它对于最终的静态字段很有用
高分回答:
如果您正在寻找初始化集合的最紧凑的方法,那就在Java9:
Set<String> strSet = Set.of("Apple", "Ball", "Cat", "Dog");
复制代码
=====================下面的详细答案=========================== =======
使用Java 10(不可修改集)
Set<String> strSet1 = Stream.of("A", "B", "C", "D")
.collect(Collectors.toUnmodifiableSet());
复制代码
从set -> (Set)Set.of(set.toArray())源代码中的语句可以明显看出,收集器实际上将返回Java 9中引入的不可修改集合。
需要注意的一点是,该方法Collections.unmodifiableSet()返回指定集的不可修改视图(根据文档)。的修改视图集合是集合,是不可修改的,并且也是图到背衬集合。请注意,变更为后盾收集可能仍然是可能的,如果它们发生,他们是通过修改视图可见。但是该方法Collectors.toUnmodifiableSet()返回Java 10中真正不变的集合。
使用Java 9(不可修改集)
以下是初始化集合的最紧凑的方法:
Set<String> strSet6 = Set.of("Apple", "Ball", "Cat", "Dog");
复制代码
我们有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()
] [6]方法,该方法可以让我们执行附加的整理转换:
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)。
文章翻译自 am2dgbqfb6mk75jcyanzabc67y-ac4c6men2g7xr2a-stackoverflow-com.translate.goog/questions/2…
作者建议: 我会选择使用java 8 流处理:Set strSet1 = Stream.of(“A”, “B”, “C”, “D”)
.collect(Collectors.toCollection(HashSet::new));
真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话
求点赞? 求关注❤️ 求分享? 对8块腹肌的我来说真的 非常有用!!!
如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️