深入剖析 Java 新特性
范学雷
前 Oracle 首席软件工程师,Java SE 安全组成员,OpenJDK 评审成员
16539 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 23 讲
深入剖析 Java 新特性
15
15
1.0x
00:00/00:00
登录|注册

05 | 类型匹配:怎么切除臃肿的强制转换?

你好,我是范学雷。今天,我们聊一聊 Java 模式匹配,主要是类型匹配。
Java 的模式匹配是一个新型的、而且还在持续快速演进的领域。类型匹配是模式匹配的一个规范。类型匹配这个特性,首先在 JDK 14 中以预览版的形式发布。在 JDK 15 中,改进的类型匹配再次以预览版的形式发布。最后,类型匹配在 JDK 16 正式发布。
那么,什么是模式匹配,什么又是类型匹配呢?这就要说到模式的组成。通常,一个模式是匹配谓词和匹配变量的组合。其中,匹配谓词用来确定模式和目标是否匹配。在模式和目标匹配的情况下,匹配变量是从匹配目标里提取出来的一个或者多个变量。
对于类型匹配来说,匹配谓词用来指定模式的数据类型,而匹配变量就是一个属于该类型的数据变量。需要注意的是,对于类型匹配来说,匹配变量只有一个。
这样的描述还是太抽象,太难理解。我们还是通过案例和代码,一点一点地来理解类型匹配吧。

阅读案例

在程序员的日常工作中,一个重要的事情,就是把相似的东西抽象出来,设计成一个通用的、可以复用的接口。
比如说,我们从正方形、长方形、圆形这些看起来差异巨大的东西出发,抽象出了形状这个接口。我们希望使用一个实例时,如果我们不能确定它是正方形还是长方形,我们至少还能确定它是一个形状。这种模模糊糊的确定性(其实也是不确定性),其实对我们编写代码有巨大的帮助,包括但是不限于简化代码逻辑,减少代码错误。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Java模式匹配中的类型匹配是一个重要特性,通过匹配谓词和匹配变量的组合,指定模式的数据类型并提取相应的数据变量。传统的类型转换操作存在繁琐的步骤,容易引入错误,而类型匹配通过简化代码逻辑、减少错误潜入,提高生产效率。文章介绍了不同的代码组织方式,并分析了它们的特点,其中紧跟着类型匹配语句的代码布局被认为是最安全、不容易出错且易于阅读的方式。此外,实例匹配还带来了性能优势,通过测试发现使用实例匹配代码的吞吐量提高了将近20%。总的来说,本文深入探讨了Java模式匹配中类型匹配的重要性和优势,以及匹配变量的作用域和不同代码组织方式的影响,对于想要深入了解Java模式匹配的开发人员具有重要的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入剖析 Java 新特性》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(16)

  • 最新
  • 精选
  • 许灵
    置顶
    https://github.com/XueleiFan/java-up/pull/11 老师你好!匹配变量的作用域有一种情况,在文章中没有提到。 if (!(shape instanceof Rectangle rect)) { // Field rect is in scope, local rect is not in scope here } else { // Field rect is shadowed, local rect is in scope } // Field rect is in scope, local rect is not in scope here

    作者回复: 这个发现很好。小伙伴们,咱们点赞把它置顶好吗?这样,更多的小伙伴能够看得到这种情况。

    2021-11-26
    15
  • ABC
    之前第一眼看到就觉得和try-with-resource有异曲同工之妙,减少模板代码,优化性能.

    作者回复: 嗯, 我还没联系到try-with-resource。 你这么一说,还真是有那么点意思。

    2021-11-24
    4
  • aoe
    类型匹配语法糖真甜,还能提升性能,很意外很惊喜!

    作者回复: 有办法做到JVM里,就不仅仅是语法糖了。这也是JDK能够给基于JVM的其他编程语言带来的好处。

    2021-11-24
    3
  • 码农Kevin亮
    请问老师这个性能测试是用什么工具与方法做的?

    作者回复: 请参考这里,https://github.com/openjdk/jmh。这是一个很有用的工具,建议看一看,写写性能测试。用熟了,你可能也会像我一样,喜欢上这个小工具。专栏的代码库里,也有性能测试的代码。

    2021-11-24
    3
    3
  • yihang
    老师你好,【我知道使用实例匹配会提高性能,但是没想到有这么大的提升】但反编译后的字节码都一样啊: if (obj instanceof Student stu) { System.out.println(stu); } if (obj instanceof Student) { Student stu = (Student) obj; System.out.println(stu); } 为什么会有性能提升,能看到你测试用例代码吗

    作者回复: 哦,你快来帮我看看,是不是性能测试的用例写错了?https://github.com/XueleiFan/code-bench/blob/main/src/main/java/code/bench/PatternBench.

    2022-04-19
    2
  • topsion
    老师,《代码精尽之路》专栏是哪个专栏

    作者回复: 代码精进之路

    2023-07-11归属地:陕西
    1
  • Clark
    与typescript在instanceof直接把类型确定了比,Java这个新语法还是不够优雅。 typescript: if (a instanceof Rect) { a.area(); // a is Rect } 是不是觉得ts这样挺优雅的

    作者回复: 这就牵扯到另外一个问题了,就是强类型还是弱类型的编程语言。ts这里可以做到更优雅。

    2021-11-24
    1
  • 绘世浮夸 つ
    老师可以解答一下为什么反编译的代码一样,性能是怎么提升的吗

    作者回复: 运行的时候,执行的不是反编译的代码。看看下面的问题能不能帮助你:字节码一样吗? 反编译出来的代码一样吗?反编译有没有问题?

    2023-06-06归属地:江苏
  • I PYJ
    老师,您好。文章中的这一段:下面例子中的两段代码,就是两个常见的类型转换错误。第一段代码误用了变量类型,第二段代码误用了判断结果。 我看了举例的第一段代码不存在误用来变量类型呀,您这边应该是想展示一个错误的例子,但是没有改到吧

    作者回复: 很抱歉, 已经修改了。谢谢你帮助发现了这个问题。

    2022-11-02归属地:美国
  • rocedu
    https://github.com/XueleiFan/code-bench/blob/main/src/main/java/crypto/bench/PatternBench.java 最后一个链接404了

    作者回复: 谢谢。链接应该是: https://github.com/XueleiFan/code-bench/blob/main/src/main/java/code/bench/PatternBench.java。编辑能把链接修改成一下吗?

    2022-03-26
收起评论
显示
设置
留言
16
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部