每个 Java 开发人员都必须了解的 Java 中的模式匹配和记录变化
随着 Java 16 的发布,记录 (JEP 395) 的引入带来了重大改进,它允许以更简单、更简洁的方式来声明主要使用的类来承载数据。现在,通过添加模式匹配和记录 (JEP 406),这一改进在 Java 21 中得到了进一步增强。这项新功能允许使用模式匹配来测试某个值是否是 Record 类的实例,并以更简化的方式提取其组件。在本文中,我们将探讨 Java 21 中模式匹配和记录带来的变化以及它如何使 Java 开发人员受益。
记录作为数据的透明载体
Java 16 中引入的记录是主要用于存储和携带数据的类。它们是透明的载体,这意味着它们的主要目的是保存数据,而所有其他功能(例如构造函数、方法和 equals/hashCode 方法)都是由编译器根据记录中定义的数据字段自动生成的。这使得它们非常适合在需要序列化或通过网络发送数据的场景中使用。
考虑定义两个 X 和 Y 坐标的 Line 类的示例:
记录行(int x, int y) {}
要使用此类,我们只需创建 Line 类的实例并使用内置组件访问器方法 x() 和 y() 访问其数据字段:
Line line = new Line(0, 10);
int x = line.x();
int y = line.y();
System.out.println("X: " + x + ", Y: " + y); // 输出:X:0,Y:10
与记录的模式匹配
在 Java 21 中,添加了模式匹配,这使得可以测试某个值是否是 Record 类的实例并以更简化的方式提取其组件。在处理广泛使用记录的大型代码库时,此功能特别有用。
考虑以下示例,我们要测试一个对象是否是 Line 类的实例并提取其组件:
static void length(Object obj) {
if (obj instanceof Line l) {
int x = l.x();
int y = l.y();
System.out.println(y-x);
}
}
正如您所看到的,我们使用类型模式来测试该对象是否是 Point 的实例,如果是,我们就通过调用内置组件访问器方法来提取其组件。虽然此代码有效,但可以使用 Java 21 中的记录模式进一步简化它。
使用记录模式,我们不仅可以测试一个值是否是 Record 类的实例,还可以在一行代码中提取其组件。这是通过将提取的组件的局部变量声明提升到模式本身中,并在值与模式匹配时调用访问器方法来初始化这些变量来实现的。
考虑以下使用记录模式的代码:
static void length(Object obj) {
if (obj instanceof Line(int x, int y)) {
System.out.println(y-x);
}
}
这段代码更加简洁和可读。我们不再需要创建新对象并调用其组件访问器方法来获取数据。记录模式直接为我们提取并初始化组件,让我们的代码更加精简。
嵌套记录模式
开发人员面临的主要挑战之一是处理复杂的对象图并从中提取数据。这就是模式匹配的真正威力所在,因为它允许我们优雅地扩展并匹配更复杂的对象图。
考虑以下类:Employee、Department(枚举)和 Company(记录)。我们可以使用记录模式从 Company 对象中提取员工的部门:
// 从 Java 21 开始
static void printEmployeeDepartment(公司 c, 字符串名称) {
if (c instanceof Company(部门, List员工)) {
对于(员工 e :员工){
if (e.getName().equals(name)) {
System.out.println(name + " 位于 " + dept + " 部门。");
返回;
}
}
}
System.out.println(name + "未找到。");
}
在此示例中,我们使用嵌套模式从 Company 对象中提取 Employee 的部门。我们检查给定的 Company 对象是否有部门和员工列表,然后循环列表以查找具有给定名称的员工。如果找到该员工,我们会打印他们的部门。如果没有,我们会打印一条消息,指出未找到该员工。
嵌套模式也可以用于我们想要一次匹配和解构多个值的情况。考虑以下示例,我们要检查给定坐标是否位于矩形内:
//从 Java 21 开始
记录点(双 x, 双 y) {}
记录矩形(左上点,右下点){}
// 检查给定点是否位于给定矩形内
static boolean isPointInsideRectangle(Point p, Rectangle r) {
if (r 矩形实例(Point(var x1, var y1), Point(var x2, var y2))) {
if (p.x() > x1 && p.y() > y1 && p.x()
返回真;
}
}
返回错误;
}
在此示例中,我们使用嵌套模式来检查给定的 Point 对象是否落在给定的 Rectangle 对象的范围内。嵌套模式允许我们访问矩形左上角和右下角的 x 和 y 坐标,而无需编写多行代码。
总之,通过在 Java 21 中添加模式匹配和记录 (JEP 406),我们在处理复杂对象和从复杂对象中提取数据的方式上有了显着的改进。此功能极大地简化了代码,使其更具可读性和简洁性。它还有助于处理模式匹配可能失败的故障场景。通过这些更改,Java 21 继续使代码更加精简,并改善 Java 开发者的开发体验。
通过 MyExamCloud 的 Java SE 21 开发人员专业实践测试升级您的 Java 21 技能。发展并测试您的知识,成为 Java 21 专家。
以上是每个 Java 开发人员都必须了解的 Java 中的模式匹配和记录变化的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

公司安全软件导致部分应用无法正常运行的排查与解决方法许多公司为了保障内部网络安全,会部署安全软件。...

将姓名转换为数字以实现排序的解决方案在许多应用场景中,用户可能需要在群组中进行排序,尤其是在一个用...

系统对接中的字段映射处理在进行系统对接时,常常会遇到一个棘手的问题:如何将A系统的接口字段有效地映�...

在使用IntelliJIDEAUltimate版本启动Spring...

在使用MyBatis-Plus或其他ORM框架进行数据库操作时,经常需要根据实体类的属性名构造查询条件。如果每次都手动...

Java对象与数组的转换:深入探讨强制类型转换的风险与正确方法很多Java初学者会遇到将一个对象转换成数组的�...

Redis缓存方案如何实现产品排行榜列表的需求?在开发过程中,我们常常需要处理排行榜的需求,例如展示一个�...

电商平台SKU和SPU表设计详解本文将探讨电商平台中SKU和SPU的数据库设计问题,特别是如何处理用户自定义销售属...
