Java 14 之模式匹配,非常赞的一个新特性!
前些天 jdk 14 发布了:
重磅:java 14 正式发布了!
今天栈长带大家来尝尝 java14 的鲜,虽然大家都在用着 java8 或者以下版本,但多学习了解一点总不是坏事。
比如出去面试啥的,面试官总会问你在学什么新技术,多学习下新知识可以出去和面试官吹水了。如果面试官会,你不会,那你不就 out 了!
jdk14 下载安装
首先打开 jdk14 的下载地址:
选择对应系统的版本安装。
安装细节就不展开了,相信大家都会,我这里已经装好了,来看下 jdk 版本。
$ java -version java version "14" 2020-03-17 java(tm) se runtime environment (build 14+36-1461) java hotspot(tm) 64-bit server vm (build 14+36-1461, mixed mode, sharing)
java14 is ready, let's go!!
开篇:instanceof 模式匹配
instanceof模式匹配,相当于增强的 instanceof,这目前还是 jdk 14 中的预览特性:
模式匹配的到来将使得 instanceof 变得更简洁、更安全,为什么这么说,继续往下看。
在 java 14 之前,我们判断一个对象是否是某个类派生的实例,是这样使用 instanceof
的:
if (object instanceof kid) { kid kid = (kid) object; // ... }
以上程序做了三件事:
1)判断 object 是否是 kid 的实例
2)把 object 强制转换为 kid 类型
3)创建了一个局部变量:kid
虽然这段程序很简单,大家也都是这么用的,并没有什么问题。
但这不是最佳的编写方式,判断完之后为什么还要进行一次类型强转?这应该不是必需的,而且强转的时候可能类型出错。
假如,我现在想加一个判断是不是 kiddle 的实例:
if (object instanceof kid) { kid kid = (kid) object; // ... } else if (object instanceof kiddle) { kid kid = (kid) object; // ... }
这时候类型判断完后忘了修改 kid -> kiddle,结果还是强转给 kid,这时候有两种结果:
1)kiddle 是 kid 的子类,不报错
2)kiddle 不是 kid 的子类,报错
心态是不是要崩了?
不管怎样,这程序是不健壮了,这确实不是很好的体验,模式匹配就可以避免这种问题的出现。模式匹配其实很多语言已经有了,java 来得比较晚,但总归是来了,来看下模式匹配该怎么写!
if (object instanceof kid kid) { // ... } else if (object instanceof kiddle kiddle) { // ... }
是不是看起来很爽?判断完类型后可以直接拿来用!
模式匹配其实就是对判断类型进行匹配,匹配成功后就把对象强转赋值给类型后面的变量。
注意,这个变量只有在匹配成功后才会创建和赋值,而且作用域仅只能在当前判断分支里面,如果用在分支外会出现编译错误。
另外,回到最开始的程序,如果同时出现很多个 instanceof 判断:
if (object instanceof kid1) { kid1 kid1 = (kid1) object; // ... } else if (object instanceof kid2) { kid2 kid2 = (kid2) object; // ... } else if (object instanceof kid3) { kid3 kid3 = (kid3) object; // ... } else if (object instanceof kid4) { kid4 kid4 = (kid4) object; // ... } else if (object instanceof kid5) { kid5 kid5 = (kid5) object; // ... } else if (object instanceof kid6) { kid6 kid6 = (kid6) object; // ... } else if (object instanceof kid7) { kid7 kid7 = (kid7) object; // ... } else if (object instanceof kid8) { kid8 kid8 = (kid8) object; // ... }
大量的类型转换,这程序会变得有多冗长??
所以,模式匹配不但提高了程序的安全性、健壮性,另一方面,也减少了大量不必要的类型转换,大大提高了程序的简洁性、可读性。
另外,switch
在 java 12 中加强了:java 12 骚操作, string居然还能这样玩!。如果可以使用 switch
一起结合使用,那该多好?这是以后计划的事了。
总结
instanceof模式匹配这真是 java 中的又一能力的提升,个人觉得很实用,不会觉得它多余或者像 java8 中的 lambda
、函数式编程晦涩难懂。
好了,今天就到这了,关注微信公众号:java技术栈,新特性实战陆续更新中,公众号第一时间推送。历史 java 8 - 14 新特性教程可以在公众号回复 java 获取。
栈长原创和整理不易,觉得文章不错,在看、转发分享给更多的朋友们,总能帮助有需要的人,大家一起流弊~
推荐去我的博客阅读更多:
2.spring mvc、spring boot、spring cloud 系列教程
3.maven、git、eclipse、intellij idea 系列工具教程
生活很美好,明天见~
上一篇: 51job-爬虫