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

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(objinstanceofStringss.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(objinstanceofStringss.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 i0-"负整数: "+i;caseIntegeri when i==0-"零";caseIntegeri when i100-"大整数: "+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=400code500-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;

相关文章:

JDK17-21特性Pattern-Matching详解

Pattern Matching 详解 一、知识概述 Pattern Matching(模式匹配)是 Java 引入的一系列语言特性,用于简化类型检查和数据提取。从 Java 16 开始逐步引入,到 Java 21 已成为成熟的特性。 1.1 演进历程 版本 特性 Java 16 instanceof 模式匹配(正式版) Java 17 Switch 模…...

低代码平台对接进入“MCP 2026时代”,这9个必须重写的扩展点你改对了吗?

更多请点击: https://intelliparadigm.com 第一章:MCP 2026低代码平台对接的范式跃迁 从API绑定到语义契约驱动 MCP 2026不再依赖传统RESTful端点硬编码,而是通过声明式语义契约(Semantic Contract)定义能力边界。开…...

ETASOLUTIONS钰泰 ETA9740E8A ESOP8 电池管理

特性单电感双向功率转换自动模式切换开关充电器5V同步升压,效率高达96%最大充电电流达3A,放电电流达2.4A无电池检测无需外部检测电阻4个LED电量指示...

JDK17-21特性Virtual-Threads详解

Virtual Threads 详解 一、知识概述 Virtual Threads(虚拟线程)是 Java 21 引入的重大特性,它是 Project Loom 项目的核心成果。虚拟线程是一种轻量级的线程实现,由 JVM 而非操作系统管理,可以极大地提高并发程序的可扩展性。 1.1 传统线程的局限性 在虚拟线程出现之前…...

【紧急避坑】AI开发者必看:Docker Sandbox 4类致命报错正在 silently 毁掉你的模型实验结果!

更多请点击: https://intelliparadigm.com 第一章:Docker Sandbox 运行 AI 代码隔离技术报错解决方法总览 在基于 Docker 构建的 AI 代码沙箱环境中,常见报错多源于资源限制、权限配置、依赖冲突及挂载路径不一致。以下为高频问题的系统性排…...

PvZ Toolkit:内存注入技术与游戏逆向工程的完美融合

PvZ Toolkit:内存注入技术与游戏逆向工程的完美融合 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit 当我们回顾经典游戏《植物大战僵尸》时,总会想起那些充满策略性的关卡设…...

040、未来展望:自主智能体、AGI与架构新范式

昨天深夜调一个多智能体协作的仿真环境,日志里反复报“决策循环超时”。查了半天,发现不是计算资源不够,而是几个智能体在互相等待对方的输出,形成了一个死锁环。关掉显示器点烟的时候突然想到:这不就是我们现在搞的AI Agent架构的缩影吗?每个模块都挺聪明,凑在一起却可…...

【C语言嵌入式RTOS开发黄金标准】:2026版官方规范首次解禁,97%工程师尚未掌握的5大硬核约束条件

更多请点击: https://intelliparadigm.com 第一章:2026版嵌入式RTOS C语言开发规范的演进逻辑与合规性纲领 嵌入式实时操作系统(RTOS)在汽车电子、工业控制与AIoT边缘设备中的安全临界性持续提升,推动C语言开发规范从…...

VS Code Copilot Next 真实生产部署失败复盘:3家头部科技公司血泪教训,第2条99%开发者仍在踩坑

更多请点击: https://intelliparadigm.com 第一章:VS Code Copilot Next 真实生产部署失败复盘总述 在某中型 SaaS 产品团队的 CI/CD 流水线升级中,VS Code Copilot Next 被引入作为开发辅助层,计划集成至远程开发容器&#xff0…...

Qwen3.5-2B入门指南:Clear Chat与Export History在团队协作中的妙用

Qwen3.5-2B入门指南:Clear Chat与Export History在团队协作中的妙用 1. 认识Qwen3.5-2B轻量化模型 Qwen3.5-2B是阿里云推出的轻量化多模态基础模型,属于Qwen3.5系列的小参数版本(20亿参数)。这个模型特别适合团队协作场景&#…...

企业如何用客户关系管理系统提升销售业绩?3步实现业绩增长的实战指南

很多企业在销售管理中会遇到这样的困境:客户没少开发,但成交率一直上不去;销售员没少努力,但业绩就是不见增长;团队没少开会,但问题总是反复出现。实际上,这些都是客户关系管理系统可以解决的问…...

驱动基础知识

makefile添加模块编译好.ko文件后 insmod添加模块 ,由于学习使用的是虚拟终端需要使用dmesg 指令显示Kconfig是定义可配置项,让用户选择对应功能,Makefile会根据用户选择的配置项来控制代码的编译行为。驱动三种状态编译进内核,编…...

RS-485故障安全偏置技术演进与工程实践

1. RS-485故障安全偏置技术背景解析在工业现场总线通信领域,RS-485标准已经服役超过30年,却依然是许多工程师的"痛点"。这个看似简单的差分通信协议,在实际部署中常常会遇到一个典型问题:当总线处于空闲状态时&#xff…...

NE2281 1000W PFC芯片,主要应用于boost PFC变换器

1、方案名称:NE2281 1000W PFC芯片,主要应用于boost PFC变换器 2、品牌:星云半导体(NEBULA) 3、描述:NE2281 是一款高性能、多模式工作的 AC/DC控制器,具有高集成度、高效率等特性&#xff0c…...

LFM2.5-1.2B-Instruct一文详解:28T训练预算带来的小模型高泛化能力

LFM2.5-1.2B-Instruct一文详解:28T训练预算带来的小模型高泛化能力 1. 模型概述与核心优势 LFM2.5-1.2B-Instruct是一个参数量仅为1.2B的轻量级指令微调大语言模型,由Liquid AI和Unsloth团队联合开发。这个模型最引人注目的特点是:用28T to…...

vulhub系列-34-Os-ByteSec(超详细)

免责声明:本文记录的是 Os-ByteSec 渗透测试靶机 的解题过程,所有操作均在 本地授权环境 中进行。内容仅供 网络安全学习与防护研究 使用,请勿用于任何非法用途。读者应遵守《网络安全法》及相关法律法规,自觉维护网络空间安全。目…...

手把手教你用readl/writel调试树莓派GPIO(基于Linux/io.h)

手把手教你用readl/writel调试树莓派GPIO(基于Linux/io.h) 树莓派作为一款广受欢迎的嵌入式开发平台,其GPIO控制一直是开发者关注的焦点。不同于常见的用户空间GPIO库(如WiringPi或RPi.GPIO),本文将带你深入…...

LLVMSwift:用Swift原生封装LLVM,实现类型安全的编译器开发

1. 项目概述与核心价值如果你是一个 Swift 开发者,同时对编译原理、程序分析或者高性能计算感兴趣,那么你很可能听说过 LLVM。这个强大的编译器基础设施几乎无处不在,从 Clang 到 Swift 编译器本身,再到各种 JIT 引擎,…...

vulhub系列-33-hacksudo - Thor(超详细)

免责声明:本文记录的是 hacksudo - Thor 渗透测试靶机 的解题过程,所有操作均在 本地授权环境 中进行。内容仅供 网络安全学习与防护研究 使用,请勿用于任何非法用途。读者应遵守《网络安全法》及相关法律法规,自觉维护网络空间安…...

JPEGsnoop深度解析:当你的JPEG图像需要“法医级“诊断时

JPEGsnoop深度解析:当你的JPEG图像需要"法医级"诊断时 【免费下载链接】JPEGsnoop JPEGsnoop: JPEG decoder and detailed analysis 项目地址: https://gitcode.com/gh_mirrors/jp/JPEGsnoop 在数字图像处理的日常工作中,你是否曾遇到过…...

小白技能库:技术新人的场景化学习指南与开源项目实践

1. 项目概述:小白技能库的诞生与价值最近在GitHub上看到一个挺有意思的项目,叫“aptratcn/xiaobai-skills”。光看名字,你大概就能猜到它的定位——“小白技能库”。作为一个在技术社区混迹了十多年的老鸟,我第一眼看到这个项目时…...

Cursor AI 代理 9 秒删除生产数据库:Railway 无作用域令牌与“假备份”如何让灾难成为必然

昨天,一家服务全国租车公司的 SaaS 创业公司 PocketOS 生产环境瞬间归零。 不是黑客入侵,不是配置失误,而是一个运行在 Cursor 里的 Claude Opus 4.6 代理,在处理 staging 环境的凭证问题时,自主决定调用 Railway Grap…...

Git代码分支管理模型TBD++ Flow

现代软件开发过程中要实现高效的团队协作,需要使用代码分支管理工具实现代码的共享、追溯、回滚及维护等功能。目前流行的代码管理工具,包括CVS,SVN,Git,Mercurial等。相比CVS和SVN的集中管理,Git具有非常明显的优势,例如:去中心化的代码管理方式减少了开发者对中心服务…...

潮玩盲盒小程序开发全解析:技术架构、合规风控与运营变现

引言盲盒经济凭借 “未知性 收藏欲” 持续爆发,2024 年国内市场规模突破 500 亿元,微信小程序以低获客成本、高便捷性成为核心阵地。本文从技术选型、核心功能、合规风控到运营变现,全链路拆解盲盒小程序开发逻辑,为开发者提供可…...

基于Transformer的中文文本分类

前言 我在github上发现了一个有意思的项目Chinese-Text-Classification-Pytorch,使用pytorch复现了基于Transformer的中文文本分类。 中文数据集 我从THUCNews中抽取了20万条新闻标题,文本长度在20到30之间。一共10个类别,每类2万条。 以…...

整个 AI 项目从本地 → 部署到服务器

一、整体流程(最清晰版)本地打包镜像 → 上传到服务器 → 服务器加载镜像 → 挂载模型目录 → 启动容器 → 运行成功二、完整部署步骤(照着执行即可)1.本地:把你的 AI 项目打包成 Docker 镜像(cmd->项目根目录下执行…...

第十七届蓝桥杯省赛c++b组题解

蓝桥杯省赛自测&#xff08;CB 组&#xff09; - 洛谷 洛谷自测链接(由于数据原因 真实成绩可能与官方成绩有所出入) 1.青春常数 非常简单的入门题目 一共四年&#xff0c;前两年总和要小于后两年 即xy2026202520242023且x<y算出x的最大值即可(注意&#xff01;x可以为0 所…...

vue2+element-UI上传图片封装

针对上传组件进行封装&#xff0c;在页面直接引用即可&#xff0c;上传到minio文件服务器&#xff1a; 可以预览&#xff0c;重新上传&#xff0c;只读模式&#xff0c;可以传入展示缩略图尺寸&#xff0c;传入上传校验尺寸 <template><div><div v-if"read…...

如何用GHelper轻松掌控华硕笔记本性能:5分钟快速配置终极指南

如何用GHelper轻松掌控华硕笔记本性能&#xff1a;5分钟快速配置终极指南 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, St…...

盟接之桥®制造业EDI软件:从Forecast到Invoice,打通供应链的“任督二脉”

在全球制造业数字化转型的浪潮中&#xff0c;供应链的协同效率直接决定了企业的竞争力。对于汽车零部件、机械制造、电子电器等行业的制造企业而言&#xff0c;电子数据交换&#xff08;EDI&#xff09;已不再是“锦上添花”的选项&#xff0c;而是进入全球顶级供应链体系的“入…...