在Java 9中又新增了一些API来帮助便捷的创建不可变集合,以减少代码复杂度。
本期配套视频:
常规写法
以往我们创建一些不可变集合的时候,通常是这样写的:
代码语言:javascript复制// 不可变的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还能简化一下,可以演变成这样:
代码语言:javascript复制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,这一操作变的更为简单,只需要这样:
代码语言:javascript复制Set<String> set = Set.of("a", "b", "c");
List<Integer> list = List.of(1, 2, 3);
同时,对于一下更复杂的集合也一样支持,比如Map类型也可以这样写:
代码语言:javascript复制Map<String, String> map = Map.of("a", "1", "b", "2", "c", "3");
就是要注意下,Map.of的参数是key和value成对出现的,所以参数数量一定是偶数:
代码语言:javascript复制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值
好了,今天的分享就到这里!
我们创建了一个高质量的技术交流群,与优秀的人在一起,自己也会优秀起来,赶紧点击加群,享受一起成长的快乐。另外,如果你最近想跳槽的话,年前我花了2周时间收集了一波大厂面经,节后准备跳槽的可以点击这里领取!
推荐阅读
- Spring Boot 2.7.0发布,2.5.x将停止维护,这节奏你还更得上吗?
- Java 8的Stream操作不好调试?试试这个方法吧!
- 速领:神作《凤凰架构:构建可靠的大型分布式系统》
··································
你好,我是程序猿DD,10年开发老司机、阿里云MVP、腾讯云TVP、出过书创过业、国企4年互联网6年。从普通开发到架构师、再到合伙人。一路过来,给我最深的感受就是一定要不断学习并关注前沿。只要你能坚持下来,多思考、少抱怨、勤动手,就很容易实现弯道超车!所以,不要问我现在干什么是否来得及。如果你看好一个事情,一定是坚持了才能看到希望,而不是看到希望才去坚持。相信我,只要坚持下来,你一定比现在更好!如果你还没什么方向,可以先关注我,这里会经常分享一些前沿资讯,帮你积累弯道超车的资本。
点击领取2022最新10000T学习资料