在 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.of
和 Arrays.asList
为例,给大家列一下它们的异同:
- Java 9 中推出
List.of
创建的是不可变集合,而Arrays.asList
是可变集合 List.of
和Arrays.asList
都不允许 add 和 remove 元素,但Arrays.asList
可以调用 set 更改值,而List.of
不可以,会报java.lang.UnsupportedOperationException
异常List.of
中不允许有 null 值,Arrays.asList
中可以有 null 值