list = List.of(1, 2, 3);Map.of(k1, v1)">Java 9 新特性:不可变集合的快捷创建方法 | 程序猿DD - Java专区
跳至主要內容

Java 9 新特性:不可变集合的快捷创建方法

程序猿DD原创JavaJavaJava 9大约 2 分钟

Java 9 新特性:不可变集合的快捷创建方法

在Java 9中又新增了一些API来帮助便捷的创建不可变集合,以减少代码复杂度。

常规写法

以往我们创建一些不可变集合的时候,通常是这样写的:

// 不可变的Set Set<String> set = new HashSet<>(); set.add("a"); set.add("b"); set.add("c"); set = Collections.unmodifiableSet(set); // 不可变的List List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); list = Collections.unmodifiableList(list); 

Java8的写法

在Java 8的时候,利用Stream API还能简化一下,可以演变成这样:

Set<String> set = Collections.unmodifiableSet(Stream.of("a", "b", "c").collect(toSet())); List<Integer> list = Collections.unmodifiableList(Stream.of(1, 2, 3).collect(toList())); 

Java9的写法

而现在到了Java 9,这一操作变的更为简单,只需要这样:

Set<String> set = Set.of("a", "b", "c"); List<Integer> list = List.of(1, 2, 3); 

同时,对于一下更复杂的集合也一样支持,比如Map类型也可以这样写:

Map<String, String> map = Map.of("a", "1", "b", "2", "c", "3"); 

就是要注意下,Map.of的参数是key和value成对出现的,所以参数数量一定是偶数:

Map.of() Map.of(k1, v1) Map.of(k1, v1, k2, v2) Map.of(k1, v1, k2, v2, k3, v3) ... 

与asList的区别

看到这里,可能有的人会问了,之前不是对于集合有asXxx这样的方便方法了么?他们有啥区别吗?

这里就以List.ofArrays.asList为例,给大家列一下它们的异同:

  1. Java 9中推出List.of创建的是不可变集合,而Arrays.asList是可变集合

  2. List.ofArrays.asList都不允许add和remove元素,但Arrays.asList可以调用set更改值,而List.of不可以,会报java.lang.UnsupportedOperationException异常

  3. List.of中不允许有null值,Arrays.asList中可以有null值

好了,今天的分享就到这里!

本期配套视频:Java 9 新特性:快速定义不可变集合open in new window

如果您学习过程中如遇困难?可以加入我们超高质量的技术交流群open in new window,参与交流与讨论,更好的学习与进步!另外,不要走开,关注我!持续更新Java新特性专栏open in new window

上次编辑于:
贡献者: 程序猿DD