Java 8 之后的那些新特性(八):模式匹配 Pattern Matching
yuyutoo 2025-06-23 23:14 2 浏览 0 评论
有时候,如果你是一直编写Java程序,从未去写过其它语言的话,你可能压根意识不到Java之中有些原来写法其实是很啰嗦的。而当你使用其它一些语言的更简洁的特性时,可能就会有一种:”哇,原来可以这样"的认知。
而在这其中,模式匹配Pattern Matching就是这么一个点。
这周,继续聊一聊Java 8之后的新特性,这次聊一聊模式匹配这个特性。
这是Java 8之后的那些新特性系列的第八篇。
你熟悉的点
在Java编程中,在判断一个对象是否属于某个具体的子类时,你一定都写过类似的代码。
@Test
void testNotPatternMatching(){
AbstractMessage message = randomMessage();
if(message instanceof TextMessage){
var textMessage = (TextMessage)message;
Assertions.assertNotNull(textMessage.getText());
}
else if(message instanceof ImageMessage){
var imageMessage = (ImageMessage)message;
Assertions.assertNotNull(imageMessage.getData());
}
}
这个写法对所有Java程序员都非常熟悉,在遇到类似的场景,比如判定究竟属于哪个子类或实现时,我们都会先用instanceof来判断,然后强制转为一个具体的子类来调用子类的一些方法或属性。
如果你一直编写Java,我相信你从未感觉这个点上有什么问题。我也一直没有意识到,直到我使用了Kotlin与TypeScript之后,在这个点上,它们的处理方式并不是这样。
一对比,我就发现,这个强制转换,其实是非常多余的,完全可以在语言特性级别自动进行转换,省略掉这个多余的强制转换。
Kotlin与TypeScript
我们可以借鉴下Kotlin以及TypeScript是怎么处理这个点的。
Kotlin
@Test
fun testPatternMatching(){
val message = randomMessage()
if(message is TextMessage){
//message在这里自动转为TextMessage类型了
Assertions.assertNotNull(message.text)
}else if(message is ImageMessage){
//message在这里自动转为ImageMessage类型了
Assertions.assertNotNull(message.data)
}
}
@Test
fun testPatternMatchingInWhen(){
when(val message = randomMessage()){
is TextMessage -> Assertions.assertNotNull(message.text)
is ImageMessage -> Assertions.assertNotNull(message.data)
}
}
同样,我们看下TypeScript也是类似的
TypeScript
test('测试TypeScript的Patter Matching', () => {
const message:AbstractMessage = randomMesage()
if(message instanceof TextMesasge){
//message在这里自动转为TextMessage类型了
expect(message.text).toBeDefined()
}
else if(message instanceof ImageMessage){
//message在这里自动转为ImageMessage类型了
expect(message.data).toBeDefined()
}
})
可以看到,现代的一些新语言,在一些语法点的简洁性上确实比传统的Java好很多,无论是Kotlin还是TypeScript都可以做到模式匹配,并不需要你手动来强制转换一次。
虽然这只是一行代码的问题,但事实上在使用Kotlin类似的一些语言上,类似的简洁的点非常多,所谓积小成多,就是因为这些小的点积累起来,使得Kotlin成为一门better java
Java的改进
不过,这并不意味着Java止步不前,Java虽然历史悠久,但却也从未停止自己前进的步伐。
终于在Java 17的时候,模式匹配Pattern Matching成为了Java中的一个正式的新特性。所以,我们现在使用Pattern Matching来重写这个代码。
@Test
void testPatternMatching(){
AbstractMessage message = randomMessage();
if(message instanceof TextMessage textMessage){
Assertions.assertNotNull(textMessage.getText());
}
else if(message instanceof ImageMessage imageMessage){
Assertions.assertNotNull(imageMessage.getData());
}
}
是不是和别的语言也非常相似了。
不过有一点不同,在Java的Pattern Matching中,它并没有把原变量进行Pattern Matching处理,而是允许你在后面定义一个新变量来做Pattern Matching。
Switch与Patterm Matching
其实,Java的Pattern Matching除了可以在instanceof中使用以外,还可以在另一个场景中,Switch中也能使用。
不过Pattern Matching与Switch的结合,仍然是预览版的新特性,并没有正式确定。
在Java的新特性中,预览版意味着它在这个版本中引入,但期望收到反馈,并在未来的版本优化与改进它。所以,做为我们这样普通的Java程序员,可能并不需要太关注预览版的新特性,因为它很可能在未来会有变更。
所以我在这里就不介绍Pattern Matching与Switch结合的使用了。
但是你可以期待未来的某个Java版,你肯定可以在Switch也使用上这个Pattern Matching了。
END
这就是这周讲的Pattern Matching这个特性,其实这个特性严格的说并不是非常大,你甚至可以认为可有可无。
但从这小微小的改进中,我仍然能感受到已经27岁的Java语言,从未停止自己的脚步,不断的在前进。
这是我们做为Java程序员,应该非常高兴看到的事情了。
下周继续,讲下另一个比较重要的新特性,密封类 Sealed Class
相关推荐
- Java 代理模式详解(java代理类应用场景)
-
1.代理模式代理模式是一种比较好理解的设计模式。简单来说就是我们使用代理对象来代替对真实对象(realobject)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象...
- 深入解析Java工厂模式及其应用场景
-
Java工厂模式(FactoryPattern)是一种创建型设计模式,它提供了一种创建对象的最佳实践,这种模式提供了一种抽象工厂,通过使用工厂方法来创建对象。工厂方法将对象的创建推迟到子类中,这样就...
- java之数据格式化(java中格式化快捷键)
-
数据格式化概述1、对属性对象的输入/输出进行格式化,从其本质上讲依然属于“类型转换”的范畴。...
- Java之程序中的套路(设计模式的介绍)
-
前言本文主要是给大家简单地介绍一下设计模式的概念,文中会使用通俗易懂的案例,使你更好地学习本章知识点并理解原理,做到有道无术一.什么是设计模式首先我们得知道什么是设计模式。所谓的...
- java文本对比工具源码5(java 文本对比)
-
/***Locatethebestinstanceof'pattern'in'text'near'...
- Java微服务-设计模式系列全套文章-适配器模式(Adapter Pattern)
-
模式动机适配器模式(AdapterPattern)是一种使用频率非常高的结构型模式,如果在系统中存在不兼容的接口,可以通过引入一个适配器来使得原本因为接口不兼容而不能一起工作的两个类可以协同工作。适配...
- Java 20 发布,新特性一览:Amber、Loom 和 Panama 项目
-
作者|MichaelRedlich译者|张卫滨...
- Java语法入门004(java语法合集)
-
上篇是java语法入门003,继续学习Java[1]。...
- Java8优雅编码实战:10个技巧让你的代码焕然一新
-
引言:为什么你的Java代码还不够优雅?“代码质量直接决定开发效率与系统稳定性。据Gartner统计,60%的线上故障源于低级编码错误。本文基于10万+行生产代码优化经验,提炼Java8的10大核心...
- Java中常见的设计模式汇总?(java三种常用设计模式和实例)
-
设计模式是一套经过验证的设计方案和最佳实践,这些经验和方案主要就是用来解决软件设计过程中一些特定的问题。设计模式并不是代码本身,而是一种用来解决某种问题的抽象的解决方案,也就是说设计模式是在不同的语言...
- Java字符串拼接3大隐藏陷阱!你的代码为何越优化越慢-附提速代码
-
导语:“某电商平台因一行字符串拼接代码,每秒多消耗1GB内存!本文通过性能压测对比+字节码反编译,揭秘看似简单的字符串操作如何拖垮你的系统。文末附性能检测工具+优化模板,点击关注领取实战方案!”...
- JDK21新特性:Pattern Matching for switch
-
PatternMatchingforswitchJEP441:PatternMatchingforswitch...
- java设计模式-行为型:观察者、责任链、备忘录、命令、状态
-
责任链模式(ChainofResponsibilityPattern)是行为型设计模式的一种。在责任链模式中,多个处理器都有机会处理请求,但是每个处理器都决定它是否可以处理该请求以及它是否应该将...
- Java设计模式之外观模式(外观模式类图)
-
一、外观模式介绍1.1外观模式定义外观模式(FacadePattern),也叫门面模式,外观模式的原始定义是:为子系统中的一组接口提供统一的接口。它定义了一个更高级别的接口,使子系统更易于使用...
- java文本对比工具源码1(java快速对比数据)
-
/**DiffMatchandPatch*Copyright2018Thediff-match-patchAuthors....
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)