今天栈长带大家来尝尝 Java14 的鲜,虽然大家都在用着 Java8 或者以下版本,但多学习了解一点总不是坏事。

比如出去面试啥的,面试官总会问你在学什么新技术,多学习下新知识可以出去和面试官吹水了。如果面试官会,你不会,​那你不就 OUT 了!

JDK14 下载安装

首先打开 JDK14 的下载地址:

https://www.oracle.com/java/technologies/javase-jdk14-downloads.html

选择对应系统的版本安装。

安装细节就不展开了,相信大家都会,我这里已经装好了,来看下 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 中的预览特性:

https://openjdk.java.net/jeps/305

模式匹配的到来将使得 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 模式匹配_Java 14 模式匹配,非常赞的一个新特性!相关推荐

  1. java 怎么匹配文章_Java 14 之模式匹配,非常赞的一个新特性!

    今天栈长带大家来尝尝 Java14 的鲜,虽然大家都在用着 Java8 或者以下版本,但多学习了解一点总不是坏事. 比如出去面试啥的,面试官总会问你在学什么新技术,多学习下新知识可以出去和面试官吹水了 ...

  2. Java 14 中令人期待的五大新特性!

    随着新的 Java 发布生命周期的到来,新版本预计将于 2020 年 3 月发布,本文将对其中的 5 个主要特性作些概述. 作者 | Sylvain Saurel 译者 | 苏本如,责编 | 郭芮 出 ...

  3. java 加日期_java 给时间增加时间得到一个新的时间(日期)

    SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd") LocalDate expirationDate String exp ...

  4. JDK 14如期发布,16个新特性快速预览

    JDK 14已经于2020年3月17日如期发布.本文介绍JDK 14特性. JEP 305: instanceof的模式匹配(预览) 通过对instanceof运算符进行模式匹配来增强Java编程语言 ...

  5. 关于C++14:你需要知道的新特性

    使C++更加安全和更加方便的有用新特性 今年8月,经过投票, C++14标准获得一致通过.目前唯一剩下的工作是ISO进行C++标准的正式发布.在本文中,我关注的是新标准中的几个重要点,展示了即将到来的 ...

  6. java instant获取微秒转成日期格式_Java8新特性时间日期库DateTime API及示例

    点击上方蓝字关注「程序新视界」 Java8新特性的功能已经更新了不少篇幅了,今天重点讲解时间日期库中DateTime相关处理.同样的,如果你现在依旧在项目中使用传统Date.Calendar和Simp ...

  7. 面试官问我Java8~14的有哪些重要的新特性,我哭了~~~

    大家好,我是Guide哥!这篇文章来自读者的投稿,经过了两次较大的改动,两周的完善终于完成.Java 8新特性见这里:Java8新特性最佳指南 . Guide 哥:别人家的特性都用了几年了,我 Jav ...

  8. Java SE 笔记(扩展篇)JDK 9-17 新特性介绍

    Java新特性介绍 **注意:**推荐完成此路线所有前置内容后,再来学习本篇. 经过前面的学习,我们基本已经了解了Java 8及之前的所有语法,不过,Java 8是Oracle 公司于 2014 年 ...

  9. Java 11将于本月25日发布,新特性一览

    作者:漫画编程 来源:漫画编程 2017年8月,JCP执行委员会提出将Java的发布频率改为每六个月一次.该决定将在Java 9正式发布之后开始实行. 2018年3月,Java 10如期而至.目前已经 ...

  10. java development kie_Java Development Kit (JDK) 发展历程 及新特性

    "JDK1.5"(开发代号猛虎)的新特性 1.泛型(Generic) C++通过模板技术 可以指定集合的元素类型,而Java在1.5之前一直没有相对应的功能.一个集合可以放任何类型 ...

最新文章

  1. Android_2.2_eclips_Bundle简单传参demo
  2. javaheapspace解决方案_高手总结的9种 OOM 常见原因及解决方案
  3. python123 helloworld_python入门
  4. 对于.swp文件的恢复方法
  5. MySQL深潜|剖析Performance Schema内存管理
  6. Java BigInteger类| 带有示例的减去()方法
  7. 存储时间:立足SATA 百变GoFlex只是开始
  8. android手机冻屏问题,android 模拟冻屏 代码实现
  9. dubbo 分布式服务框架 介绍
  10. 继续ajax长轮询解决方案--递归
  11. [渝粤教育] 西南科技大学 农业技术经济学 在线考试复习资料
  12. 编写合格的C代码(1):通过编译选项将特定警告视为错误
  13. Ubuntu下安装Qt
  14. Android学习及如何利用android来赚钱
  15. 解决“无法访问。您可能没有权限使用网络资源。请与这台服务器的管理员联系以查明您是否有权限访问”的问题
  16. 结节性硬化症会一直病变吗?结节性硬化最晚多大发病?
  17. 1062 最简分数 (20 分)
  18. 图像处理:以图像分类和图像深度估计为例,如何将研究想法进行迁移学习应用?
  19. 安卓手机来电防火墙_超好用的手机APP推荐,绝对有你不知道的!
  20. SpringBoot四大核心

热门文章

  1. chrome浏览器启用本地exe程序
  2. 从Q-learning到PPO大全 深度强化学习总结和理解
  3. 关于梯度下降法、牛顿法、高斯-牛顿、LM方法的总结
  4. Netty-Pipeline组件
  5. 凸优化第五章对偶 5.6 扰动及灵敏度分析
  6. ModuleNotFoundError: No module named xxx 解决办法
  7. 采用C#泛型实现状态(State)模式
  8. Ubuntu 下使用apt-get安装最新版本的MySQL
  9. 自旋锁、排队自旋锁、MCS锁、CLH锁
  10. 【Codeforces #228】Solutions