当前位置: 首页 > news >正文

JDK17-21特性Pattern-Matching详解

Pattern Matching 详解

一、知识概述

Pattern Matching(模式匹配)是 Java 引入的一系列语言特性,用于简化类型检查和数据提取。从 Java 16 开始逐步引入,到 Java 21 已成为成熟的特性。

1.1 演进历程

版本特性
Java 16instanceof 模式匹配(正式版)
Java 17Switch 模式匹配(预览)
Java 18Switch 模式匹配增强(预览)
Java 19Record 模式匹配(预览)
Java 20Record 模式匹配增强(预览)
Java 21Switch 模式匹配、Record 模式匹配(正式版)

1.2 解决的问题

传统 Java 需要大量的instanceof检查和类型转换:

// 传统写法:冗长且容易出错Objectobj=getValue();if(objinstanceofString){Stringstr=(String)obj;System.out.println(str.length());}// 使用模式匹配:简洁明了if(objinstanceofStringstr){System.out.println(str.length());}

二、知识点详细讲解

2.1 instanceof 模式匹配

2.1.1 基本用法
publicclassInstanceofPatternMatching{publicstaticvoidmain(String[]args){// 基本模式匹配Objectobj="Hello, Pattern Matching!";// 旧写法if(objinstanceofString){Strings=(String)obj;System.out.println("Old way: "+s.length());}// 新写法:类型模式和变量绑定if(objinstanceofStrings){System.out.println("New way: "+s.length());}// 模式变量作用域if(objinstanceofStrings&&s.length()>5){System.out.println("Long string: "+s.substring(0,5));}// 不能在 false 分支使用(编译错误)// if (!(obj instanceof String s)) {// System.out.println(s); // 编译错误// }}}
2.1.2 流式作用域
publicclassFlowScoping{publicstaticvoidmain(String[]args){Objectobj=Math.random()>0.5?"Hello":42;// 模式变量仅在"肯定会匹配"的分支可见if(objinstanceofStrings){System.out.println("是字符串: "+s);// s 在此作用域内可用}// s 在此不可用// 结合条件表达式if(objinstanceofStrings&&s.length()>3){// 只有两个条件都满足才进入System.out.println("长字符串: "+s);}// 使用 || 时的注意事项if(objinstanceofIntegeri||objinstanceofStrings){// 这里 i 或 s 可能未初始化// 需要再次检查才能使用if(objinstanceofIntegernum){System.out.println("整数: "+num);}elseif(objinstanceofStringstr){System.out.println("字符串: "+str);}}}// 方法的流式作用域staticStringprocess(Objectobj){// 编译器能推断变量是否已初始化if(!(objinstanceofStrings)){return"Not a string";}// s 在此可用,因为上面如果不是字符串已返回returns.toUpperCase();}}

2.2 Switch 模式匹配

2.2.1 基本语法
publicclassSwitchPatternMatching{publicstaticvoidmain(String[]args){Object[]values={"hello",42,3.14,true,newint[]{1,2,3}};for(Objectvalue:values){Stringresult=formatValue(value);System.out.println(result);}}// 传统 switch 不支持类型判断staticStringformatValueOld(Objectobj){if(objinstanceofIntegeri){return"Integer: "+i;}elseif(objinstanceofStrings){return"String: "+s;}elseif(objinstanceofDoubled){return"Double: "+d;}else{return"Unknown: "+obj;}}// 使用 switch 模式匹配staticStringformatValue(Objectobj){returnswitch(obj){caseIntegeri->"Integer: "+i;caseStrings->"String: "+s;caseDoubled->"Double: "+d;caseBooleanb->"Boolean: "+b;casenull->"null value";default->"Unknown: "+obj;};}}
2.2.2 带守卫的模式匹配
publicclassGuardedPatterns{publicstaticvoidmain(String[]args){Object[]values={"","hello",0,42,-5,100L,3.14};for(Objectvalue:values){System.out.println(categorize(value));}}// 使用 when 子句添加守卫条件staticStringcategorize(Objectobj){returnswitch(obj){caseStrings when s.isEmpty()->"空字符串";caseStrings when s.length()>10->"长字符串: "+s.substring(0,10)+"...";caseStrings->"字符串: "+s;caseIntegeri when i<0->"负整数: "+i;caseIntegeri when i==0->"零";caseIntegeri when i>100->"大整数: "+i;caseIntegeri->"整数: "+i;caseLongl->"长整型: "+l;caseDoubled->"双精度: "+d;default->"其他类型";};}// 实际应用:处理不同类型的消息staticvoidhandleMessage(Objectmessage){switch(message){caseStringtext when text.startsWith("ERROR:")->System.out.println("错误消息: "+text);caseStringtext when text.startsWith("WARN:")->System.out.println("警告消息: "+text);caseStringtext->System.out.println("普通消息: "+text);caseIntegercode when code>=400&&code<500->System.out.println("客户端错误: "+code);caseIntegercode when code>=500->System.out.println("服务器错误: "+code);caseIntegercode->System.out.println("状态码: "+code);casenull->System.out.println("空消息");default->System.out.println("未知消息类型");}}}
2.2.3 匹配顺序的重要性
publicclassPatternOrder{publicstaticvoidmain(String[]args){CharSequencecs="Hello";System.out.println(analyze(cs));// 输出: String: Hello}// 模式匹配按顺序匹配,更具体的类型应放在前面staticStringanalyze(Objectobj){returnswitch(obj){// ❌ 错误顺序:CharSequence 包含 String,永远不会匹配到 String// case CharSequence cs -> "CharSequence: " + cs;// case String s -> "String: " + s; // 永远不会执行// ✅ 正确顺序:更具体的类型在前caseStrings->"String: "+s;caseCharSequencecs->"CharSequence: "+cs;caseIntegeri->"Integer: "+i;caseNumbern->"Number: "+n;
http://www.jsqmd.com/news/711997/

相关文章:

  • 【C语言嵌入式RTOS开发黄金标准】:2026版官方规范首次解禁,97%工程师尚未掌握的5大硬核约束条件
  • 如何用 Viewer.js 打造完美的图像查看体验:新手快速上手指南
  • Flutter for OpenHarmony跨平台技术
  • RoPE旋转位置编码:原理、实现与NLP应用实践
  • ConceptMoE架构:动态语义压缩优化大规模语言模型
  • 040、未来展望:自主智能体、AGI与架构新范式
  • 【VS Code Copilot Next 生产级工作流配置指南】:20年DevOps专家亲授自动化部署避坑清单(含3大高危配置雷区)
  • 2026年工业门厂家排行:兰州工业门/兰州快速卷帘门/兰州快速门/兰州感应门/兰州抗风卷帘门/兰州柔性大门/兰州水晶卷帘门/选择指南 - 优质品牌商家
  • 跨平台技术
  • 大型语言模型编辑技术:CrispEdit原理与应用
  • VSCode/Trae使用Codex插件接入第三方中转API使用GPT-5.4的图文教程 VSCode Codex、GPT-5.4 API接入、Codex第三方API配置、Trae Codex教程
  • PvZ Toolkit:内存注入技术与游戏逆向工程的完美融合
  • svn2git部署指南:在Linux系统上安装和配置的完整流程
  • 一、QGroundControl地面站:开发教程(2)
  • Gemma-4开源模型效果展示:原生图像理解能力在技术截图分析中的真实表现
  • 知名壁画品牌与源头工厂推荐:ENGLONG英仑家居新中式、酒店背景墙、刺绣软硬包定制厂家一站式选型 - 栗子测评
  • 一场关于AI面试精准度的真实较量:三大梯队主流工具深度测评!
  • 2026园艺喷壶哪家好?洒水壶生产厂家/塑料喷壶源头厂家精选推荐 - 栗子测评
  • Hermes vs OpenClaw:社区真实体验对比,谁更适合你?
  • ensp- ACL 综合配置实验(附拓扑与完整步骤)
  • 如何在OBS Studio中免费使用VST插件:提升直播音频质量的完整指南
  • LM文生图参数详解:CFG Scale 4.5–6.5对人像质感的影响实测
  • 2026西宁铝镁锰板厂家怎么选:青海仿古瓦/青海冷库板/青海岩棉板/青海彩钢厂/青海彩钢岩棉夹心板/青海彩钢岩棉板/选择指南 - 优质品牌商家
  • 2026年3月头部熟食礼盒定制厂家推荐,蘑菇木耳礼盒/熟食礼盒/牛羊肉礼盒/蛋类礼盒/大闸蟹礼盒,熟食礼盒品牌推荐 - 品牌推荐师
  • 天赐范式第24天:我们的研究发现,究竟有什么深层次的历史意义吗?文心如是说:~
  • 2026年AI面试软件深度测评:谁能真正实现“精准初面替代”!
  • FinFET技术如何革新FPGA设计与性能
  • 跨模型AI协作平台:架构设计与性能优化实践
  • 基于Node.js与SQLite构建命令行面试知识库管理工具
  • 兰州钢塑波纹管技术解析:兰州孔网钢带塑料复合管/兰州孔网钢带复合管/兰州孔网钢带管/兰州孔网钢带聚乙烯复合管/兰州孔网钢骨架塑料复合管/选择指南 - 优质品牌商家