java pair JDK21新特性Record Patterns记录模式详解
java pair JDK21新特性Record Patterns记录模式详解
2 发展史
由 JEP 405 提出的预览功能,并在JDK 19发布java pair,然后由 JEP 432 再次预览,并在JDK 20发布。该功能与用于的模式匹配(JEP 441)共同演进,并且二者有相当大的交互作用。本JEP提议在持续的经验和反馈基础上对该功能完善。
除了一些次要的编辑更改,自第二个预览版以来的主要变化是删除了对增强for语句头部出现记录模式的支持。这个功能可能会在未来的JEP中重提。
3 目标4 动机
Java 16中,JEP 394 扩展了运算符java pair,使其可接受类型模式并执行模式匹配。这个简单的扩展使得熟悉的和强制转换惯用法变得更简洁、更不易出错:
// <Java 16
if (obj instanceof String) {
String s = (String)obj;
... 使用s ...
}
// ≥Java 16
if (obj instanceof String s) {
... 使用s ...
}
新代码中,若obj在运行时是的实例,则obj与类型模式 s匹配。若模式匹配成功,则 true,且模式变量s被初始化为obj强制转换为的值,然后可以在包含的代码块中使用。
类型模式一次性消除了许多类型转换的出现。然而,它们只是朝着更声明式、以数据为焦点的编程风格迈出的第一步。随Java支持新的、更具表现力的数据建模,模式匹配可通过让开发表达模型的语义意图来简化对这些数据的使用。
5 和
记录 (JEP 395) 是数据的透明载体。接收记录类实例的代码通常会使用内置的组件访问器方法提取数据,即组件。
5.1 Point的实例
如用类型模式测试一个值是否是记录类Point的实例,并在匹配成功时从该值中提取x和y组件。
Java8
class Point {
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
}
static void printSum(Object obj) {
if (obj instanceof Point) {
Point p = (Point) obj;
int x = p.getX();
int y = p.getY();
System.out.println(x + y);
}
}
≥Java 16

record Point(int x, int y) {}
static void printSum(Object obj) {
if (obj instanceof Point p) {
int x = p.x();
int y = p.y();
System.out.println(x+y);
}
}
仅使用模式变量p调用访问方法x()、y(),这些方法返回组件x和y的值。
在每个记录类中,其访问方法和组件之间存在一对一对应关系。
如果模式不仅可测试一个值是否是Point的实例,还可直接从该值中提取x和y组件,从而代表我们调用访问器方法的意图将更好。换句话说:
// Java 21及以后
static void printSum(Object obj) {
if (obj instanceof Point(int x, int y)) {
System.out.println(x+y);
}
}
Point(int x, int y) 是一个 。它将用于提取组件的局部变量的声明直接提升到模式本身java pair,并在值与模式匹配时通过调用访问方法对这些变量初始化。实际上, 将记录的实例解构为其组件。
6 嵌套
模式匹配的真正威力在于优雅扩展到匹配更复杂的对象图。
考虑以下声明:
// Java 16及以后
record Point(int x, int y) {}
enum Color { RED, GREEN, BLUE }
record ColoredPoint(Point p, Color c) {}
record Rectangle(ColoredPoint upperLeft, ColoredPoint lowerRight) {}
已知可使用记录模式提取对象的组件。如想从左上角点提取颜色:
// Java 21及以后
static void printUpperLeftColoredPoint(Rectangle r) {
if (r instanceof Rectangle(ColoredPoint ul, ColoredPoint lr)) {
System.out.println(ul.c());
}
}
但值ul本身是个记录值,希望进一步分解。因此,记录模式支持嵌套,允许对记录组件进一步匹配、分解。可在记录模式中嵌套另一个模式,同时对外部和内部记录分解:
// Java 21及以后
static void printColorOfUpperLeftPoint(Rectangle r) {
if (r instanceof Rectangle(ColoredPoint(Point p, Color c),
ColoredPoint lr)) {
System.out.println(c);
}
}
嵌套模式允许以与组装对象的代码一样清晰简洁方式拆解聚合。如创建一个矩形,通常会将构造函数嵌套在一个表达式中:
// Java 16及以后
Rectangle r = new Rectangle(new ColoredPoint(new Point(x1, y1), c1),

new ColoredPoint(new Point(x2, y2), c2));
使用嵌套模式,我们可以使用与嵌套构造函数结构相似的代码来解构这样的矩形:
// Java 21及以后
static void printXCoordOfUpperLeftPointWithPatterns(Rectangle r) {
if (r instanceof Rectangle(ColoredPoint(Point(var x, var y), var c),
var lr)) {
System.out.println("Upper-left corner: " + x);
}
}
嵌套模式可能无法匹配:
// Java 21及以后
record Pair(Object x, Object y) {}
Pair p = new Pair(42, 42);
if (p instanceof Pair(String s, String t)) {
System.out.println(s + ", " + t);
} else {
System.out.println("Not a pair of strings");
}
这里的记录模式Pair( s, t)包含了两个嵌套的类型模式,即 s和 t。如果一个值与模式Pair( s, t)匹配,那么它是一个Pair,并且递归地java pair JDK21新特性Record Patterns记录模式详解,它的组件值与类型模式 s和 t匹配。在我们上面的示例代码中,由于记录的两个组件值都不是字符串,因此这些递归的模式匹配失败,因此执行else块。
总之,嵌套模式消除了导航对象的意外复杂性,使我们能专注这些对象所表示的数据。它们还赋予我们集中处理错误的能力,因为如果一个值无法与嵌套模式P(Q)匹配,那子模式P和Q中的任何一个或两个都无法匹配。我们不需要检查和处理每个单独的子模式匹配失败——要么整个模式匹配,要么不匹配。
7 描述
使用可嵌套的记录模式。
模式语法变为:
Pattern:
TypePattern
RecordPattern
TypePattern:
LocalVariableDeclaration
RecordPattern:
ReferenceType ( [ PatternList ] )
PatternList:
Pattern { , Pattern }
8 记录模式
由记录类类型和(可能为空的)模式列表组成,该列表用于与相应的记录组件值进行匹配。
如声明
record Point(int i, int j) {}
如果值v与记录模式Point(int i, int j)匹配,则它是记录类型Point的实例;如这样,模式变量i将被初始化为在值v上调用与i对应的访问器方法的结果,模式变量j将被初始化为在值v上调用与j对应的访问器方法的结果。(模式变量的名称不需要与记录组件的名称相同;也就是说,记录模式Point(int x, int y)的行为相同,只是模式变量x和y被初始化。)
null值不与任何记录模式匹配。
记录模式可用var来匹配记录组件java pair JDK21新特性Record Patterns记录模式详解,而无需声明组件的类型。在这种情况下,编译器会推断由var模式引入的模式变量的类型。如模式Point(var a, var b)是模式Point(int a, int b)的简写。
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299
资源库 - 资源分享下载网 » java pair JDK21新特性Record Patterns记录模式详解
常见问题FAQ
- 关于资源售价和售后服务的说明?
- 代码有没有售后服务和技术支持?
- 有没有搭建服务?
- 链接地址失效了怎么办?
- 关于解压密码

