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

186. Java 模式匹配 - Java 21 新特性:Record Pattern(记录模式匹配)

文章目录

  • 186. Java 模式匹配 - Java 21 新特性:Record Pattern(记录模式匹配)
    • ✅ 回顾:什么是 Record?
    • 🎯 什么是记录模式(Record Pattern)?
      • 🌰 示例:基本模式匹配
    • 🧠 深入理解:记录模式的行为规则
      • ✅ 1. 使用的是“规范构造函数”
      • ✅ 2. 你可以使用 `var` 做类型推断
      • ✅ 3. 记录模式可以嵌套!
      • ✅ 4. 可与 switch 配合使用
    • ⚠️ 注意事项与坑点提醒
      • ❌ 不支持装箱/拆箱转换
      • ❌ 不支持不可能的类型匹配
    • 🔥 补充实战场景
      • 🎨 构建坐标系统中的图形识别
    • 🧾 小结

186. Java 模式匹配 - Java 21 新特性:Record Pattern(记录模式匹配)

Java 在 SE 16 中引入了 record(记录类)作为简洁表示不可变数据的方式。而在 Java 21,记录又进化了一个层次——引入了 Record Pattern(记录模式匹配)

这意味着我们可以直接在 ifswitch 中解构 record 类型,提取其中的字段,写出更干净、更具表达力的代码。


✅ 回顾:什么是 Record?

public record Point(int x, int y) {}

等价于一个包含:

  • 两个字段 xy
  • 对应的访问器 x()y()
  • 自动生成的构造函数和 equals()hashCode()toString() 方法

🎯 什么是记录模式(Record Pattern)?

记录模式允许你使用结构匹配语法,直接从 record解构并提取字段

🌰 示例:基本模式匹配

Object o = new Point(3, 4);if (o instanceof Point(int x, int y)) {System.out.println("x = " + x + ", y = " + y);
}

✨ 说明:

  • o instanceof Point(int x, int y) 不只是判断 oPoint,还将其解构为 xy
  • xy 是自动绑定的局部变量

🧠 深入理解:记录模式的行为规则

✅ 1. 使用的是“规范构造函数”

  • record 可以声明多个构造函数
  • 但记录模式始终基于那个由编译器自动生成的“规范构造函数”
record Point(int x, int y) {Point(int x) {this(x, 0);}
}

下面这段代码无法编译:

Object o = ...;
// ❌ 不合法:没有 Point(int) 这种结构可匹配
if (o instanceof Point(int x)) {}

✅ 2. 你可以使用 var 做类型推断

record Point(double x, double y) {}Object o = new Point(1.1, 2.2);if (o instanceof Point(var x, var y)) {System.out.println("类型被推断为 double: " + x + ", " + y);
}

✅ 3. 记录模式可以嵌套!

你可以在一个 record 中匹配另一个 record。

record Point(double x, double y) {}
record Circle(Point center, double radius) {}Object o = new Circle(new Point(1.0, 2.0), 5.0);if (o instanceof Circle(Point(var x, var y), var radius)) {System.out.printf("圆心:(%f, %f), 半径:%f%n", x, y, radius);
}

💡 嵌套记录的结构匹配就像解包“洋葱层”。


✅ 4. 可与 switch 配合使用

record Box(Object o) {}Object o = new Box("hello");String result = switch (o) {case Box(String s)  -> "字符串:" + s;case Box(Integer i) -> "整数:" + i;default             -> "其他类型";
};
System.out.println(result);

⚠️ 注意事项与坑点提醒

❌ 不支持装箱/拆箱转换

record Point(Integer x, Integer y) {}Object o = new Point(1, 2);// ❌ 无法将 Integer 自动解构为 int
if (o instanceof Point(int x, int y)) {
}

你必须匹配 相同类型,不能依赖自动装箱/拆箱。


❌ 不支持不可能的类型匹配

record Box(CharSequence o) {}Object o = new Box("Java");// ❌ Integer 不是 CharSequence 的子类,编译报错
switch (o) {case Box(String s)  -> System.out.println("字符串:" + s);case Box(Integer i) -> System.out.println("整数:" + i);default             -> System.out.println("其他类型");
}

⚠️ 所有模式类型必须是组件类型的 子类型或相同类型,否则编译错误。


🔥 补充实战场景

🎨 构建坐标系统中的图形识别

record Point(int x, int y) {}
record Rectangle(Point topLeft, Point bottomRight) {}Object shape = new Rectangle(new Point(0, 0), new Point(10, 10));if (shape instanceof Rectangle(Point(int x1, int y1), Point(int x2, int y2))) {System.out.printf("矩形范围:(x1=%d, y1=%d) 到 (x2=%d, y2=%d)%n", x1, y1, x2, y2);
}

🧾 小结

功能描述
✅ 记录模式支持 record 的结构解构和字段绑定
📦 类型推断支持 var 自动推断字段类型
🧱 支持嵌套可用于深层嵌套的记录结构
💥 类型安全匹配的类型必须是字段的子类型或相同类型
⚠️ 限制不支持装箱/拆箱,不支持非规范构造函数结构匹配

🎓 建议练习

  • 尝试用记录模式重写你的 DTO 判断逻辑
  • 编写带嵌套记录结构的 switch 分支逻辑
  • 结合 sealed class + record pattern 创建结构化的业务处理模型

文章转载自:

http://zSLOJBT3.rydbs.cn
http://JB6JQT6F.rydbs.cn
http://zkJZzklj.rydbs.cn
http://S5CyjJwf.rydbs.cn
http://piNRVmFi.rydbs.cn
http://AGQrMrHq.rydbs.cn
http://hUaw028p.rydbs.cn
http://Wh6ffk17.rydbs.cn
http://ZC3ja7dI.rydbs.cn
http://BiWMqbp7.rydbs.cn
http://omx3cCDY.rydbs.cn
http://xBrB9nE7.rydbs.cn
http://fXEpH098.rydbs.cn
http://xxgXiDeB.rydbs.cn
http://FeYWE9a6.rydbs.cn
http://rwKzoVUb.rydbs.cn
http://MPwjV2Oy.rydbs.cn
http://52zJ56Pu.rydbs.cn
http://qIyOaURz.rydbs.cn
http://gwVcn3cP.rydbs.cn
http://8xJYpS4l.rydbs.cn
http://CEfFxJ4w.rydbs.cn
http://YMFKUftN.rydbs.cn
http://PsWTr2cy.rydbs.cn
http://jQMTElVg.rydbs.cn
http://yYKNfHng.rydbs.cn
http://EGEApbuo.rydbs.cn
http://16RqUcNc.rydbs.cn
http://H08MNeHX.rydbs.cn
http://vqGzVdBm.rydbs.cn
http://www.dtcms.com/a/380683.html

相关文章:

  • Electron下载失败
  • Origin绘制双Y轴网格叠加图|科研论文图表教程(附数据排列格式)
  • XXL-JOB框架SRC高频漏洞分析总结
  • 未启用Spring事务管理 执行mapper.xml文件的sql,为什么会自动提交
  • 亚马逊云代理:亚马逊云怎么样进行大规模数据分析与处理?
  • Linux防火墙iptables
  • 基于联邦学习与神经架构搜索的可泛化重建:用于加速磁共振成像|文献速递-最新医学人工智能文献
  • 如何将 Wine 应用包转换成玲珑格式包:完整技术教程
  • 函数库 动静态库
  • EPC企业如何通过数字化管理提高盈利能力?
  • P2678 [NOIP 2015 提高组] 跳石头
  • 旋转位置编码的论文阅读
  • UE5 基础应用 —— 08 - 动画蓝图 简单使用
  • unity pcd 二进制版 简单显示文件对象(单色)
  • 面试题:Redis要点总结(复制、哨兵、集群)
  • Leetcode 18 java
  • Redis集群为何采用16384个槽的设计?
  • 《树与二叉树详解:概念、结构及应用》
  • Certimate SSL证书自动申请部署
  • 《Spring事务的失效》
  • Maya绑定:小球挤压拉伸变形详细绑定(晶格、簇、测量工具、节点编辑器)
  • 【比亚迪璇玑架构深度解析:重新定义智能电动汽车的“整车智能”】
  • jdbc DAO封装及BaseDAO工具类
  • jajajajajajajava
  • 自动生成链接
  • LeetCode 3258.统计满足K约束的子字符串数量 I
  • “量子能量泵”:一种基于并联电池与电容阵的动态直接升压架构
  • fastapi 使用本地资源自定义swagger文档
  • Vue FullPage.js 完整使用指南:Vue 3 官方全屏滚动解决方案
  • ARM IRQ中断