专栏首页Java技术栈Java 14 之模式匹配,非常赞的一个新特性!

Java 14 之模式匹配,非常赞的一个新特性!

前些天 JDK 14 发布了:

重磅:Java 14 正式发布了!

今天栈长带大家来尝尝 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技术栈(javastack),作者:栈长

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 我天!xx.equals(null) 是什么骚操作??

    我的天,最近做 Code Review 看到一个同事的骚操作,他写了一个工具类,大概是这样的:

    Java技术栈
  • 实现java多线程的3种方式,99%人没用过第3种

    实现多线程的3种方式 1、继承Thread类 看jdk源码可以发现,Thread类其实是实现了Runnable接口的一个实例,继承Thread类后需要重写run...

    Java技术栈
  • 在阿里干了5年招聘,这10条建议我必须分享给你!

    前阵子,我和阿里的薪酬福利专家M同学聊了一下午,M同学做了9年薪酬,和我们吐槽了很多薪酬方面的现象,也道出了少有人关注的薪酬逻辑和常识。

    Java技术栈
  • 5分钟面试指南(第三十三篇 redis之应用)

    本部分我们会为大家提供一些python初级工程师在面试过程中遇到的常见的面试题目,期望达到的效果:

    还是牛6504957
  • 理解CSS伪元素 :before 和 :after

    层叠样式表(CSS)的主要目的是给HTML元素添加样式,然而,在一些案例中给文档添加额外的元素是多余的或是不可能的。事实上CSS中有一个特性允许我们添加额外元素...

    疯狂的技术宅
  • 5分钟面试指南(第三十一篇 初认redis)

    本部分我们会为大家提供一些python初级工程师在面试过程中遇到的常见的面试题目,期望达到的效果:

    还是牛6504957
  • 5分钟面试指南(第三十二篇 redis之集群篇)

    本部分我们会为大家提供一些python初级工程师在面试过程中遇到的常见的面试题目,期望达到的效果:

    还是牛6504957
  • 【.NET】UnpackMe!Shielden+DNGuard,双层变异壳 - 脱壳详解

    前言:自从脱壳神器de4dot横空出世以来,我们可以看到几乎所有的.net破文中的第一部分就是不管三七二十一把程序丢进去脱壳以及反混淆。可是你真的明白de4do...

    逸鹏
  • 轻松看懂机器学习十大常用算法

    通过本篇文章大家可以对ML的常用算法形成常识性的认识。没有代码,没有复杂的理论推导,仅是图解,介绍这些算法是什么以及如何应用(例子主要是分类问题)。 今天的算法...

    首席架构师智库
  • 算法——贝叶斯

    简介 学过概率理论的人都知道条件概率的公式:P(AB)=P(A)P(B|A)=P(B)P(A|B);即事件A和事件B同时发生的概率等于在发生A的条件下B发生的概...

    cloudskyme

扫码关注云+社区

领取腾讯云代金券