”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 探索 Java 记录模式和模式匹配

探索 Java 记录模式和模式匹配

发布于2024-08-23
浏览:446

Exploring Java Record Patterns and Pattern Matching

Java 记录模式是作为 Amber 项目的一部分在 Java 16 中引入的,并在 Java 21 中通过添加解构函数和模式匹配进行了增强。此功能允许在 Java 应用程序中以更简洁、更灵活的方式处理数据。在本教程中,我们将介绍记录模式的概念、它们如何帮助模式匹配以及各种编码示例。

1。 Java 记录快速回顾
在深入研究记录模式之前,让我们快速回顾一下 Java 记录。记录是在 Java 14 中引入的,它是一种专门为保存不可变数据而设计的新型类。它们通过提供更简洁的语法来定义带有数据的类,从而消除了编写样板代码的需要。在以下示例中,我们定义一个名为“Person”的记录,其中包含三个字段:名字、姓氏和年龄。

记录人(字符串名字,字符串姓氏,int年龄){}

记录是不可变的,限制某些特征:

  • 所有字段均为最终字段
  • 该类隐式是final
  • 禁止声明实例字段

Records会自动为每个字段生成构造函数和getter方法,使它们比传统类更适合数据载体。

2.什么是记录模式?
Java 21 中引入的记录模式将模式的概念与记录相结合,允许轻松地从记录中解构和提取值。记录模式由记录类类型和可选模式变量组成,仅当测试成功时,这些变量才会被分配从目标记录中提取的值。

空值不匹配任何记录模式,因此在这种情况下模式变量不会被初始化。

3.记录析构函数
析构函数是构造函数的逆函数。它从对象中提取值而不是添加它们。在记录的上下文中,析构函数称为“解构函数”。它允许将记录值分解为其各个组成部分。假设我们有一条名为“Name”的记录,其中包含以下字段:

记录客户(字符串名字,字符串姓氏,int年龄){}

我们可以使用解构函数从“Customer”记录的实例中提取这些字段的值,如下例所示:

客户客户 = 新客户("Jane", "Smith", 30);

if (客户实例客户(字符串名字, 字符串姓氏, int 年龄)) {
System.out.println("名字:" firstName); // 简
System.out.println("姓氏:" lastName); // 史密斯
System.out.println("年龄:" 年龄); // 30
}

记录结构在我们需要将多个相关值作为单个对象存储和检索的情况下非常有用。记录的解构功能使我们能够轻松提取并在代码中使用这些值。

4。在 Switch 语句中记录模式
Java 16 引入了instanceof 语句的模式匹配,并在Java 21 中进一步扩展以包含switch 语句。它在处理多种模式时允许更简洁和可读的代码。

假设我们有一条名为“Account”的记录,具有三个子类型:“SavingAccount”、“CreditCardAccount”和“HomeLoanAccount”。每个子类型都有不同的计算余额的方法。我们可以在 switch 语句中使用记录模式来处理这三种情况,如下所示:

接口帐户 {}
记录 SavingAccount(双余额)实现帐户 {}
record CreditCardAccount(doublecreditLimit, doubleused) 实现帐户 {}
record HomeLoanAccount(double totalAmount, double amountPaid) 实现帐户 {}

账户 account= new CreditCardAccount(10000, 1000);

开关(形状){
案例 SavingAccount s:
System.out.println("账户余额为 " 余额);
休息;
案例信用卡帐户 c:
System.out.println("信用余额为:" (creditLimit-used));
休息;
案例 HomeLoanAccount h:
System.out.println("余额" (totalAmount-已付金额));
休息;
默认:
System.out.println("未知帐户");
}

5.嵌套模式
除了从单个记录中提取值之外,还可以嵌套记录模式以处理更复杂的记录。假设我们有一条名为“Account”的记录,其中有一个类型为“Customer”的字段和另一个类型为“Address”的字段。我们可以使用嵌套记录模式从这两个字段中提取值,如以下示例所示:

记录客户(字符串名字,字符串姓氏,int年龄){}

记录账户(客户客户、地址地址){}

客户客户 = 新客户("John", "Doe", 25);
地址 地址 = 新地址("主街 123 号","城市", "州");
账户 account = 新账户(客户, 地址);

if (account instanceof Account(客户(fName, lName, 年龄), 地址(街道, 城市, 州))) {
System.out.println("名字:" fName); // 约翰
System.out.println("姓氏:" lName); // 美国能源部
System.out.println("年龄:" 年龄); // 25
System.out.println("地址:"街道","城市","州); // 123 Main St.,城市,州
}

在此示例中,我们使用两个嵌套模式从“Account”记录的“Customer”和“Address”字段中提取值。

6。组件匹配
记录模式提供了更大的灵活性,因为模式变量不必与记录的组件名称匹配。只要它们兼容,模式匹配就会成功。例如:

记录客户(字符串名字,字符串姓氏,int年龄){}

记录账户(客户客户、地址地址){}

客户客户 = 新客户("John", "Doe", 25);

if (客户实例客户(var fn, var ln, var Age)) {
System.out.println("名字:" fn); // 约翰
System.out.println("姓氏:" ln); // 美国能源部
System.out.println("年龄:" 年龄); // 25
}

// 访问嵌套记录组件
账户 account = new Account(customer, new Address("123 Main St", "New York", "NY"));
if (account instanceof Account(var cust, var 地址)) {
System.out.println("客户:" cust); // 客户[名字=约翰,姓氏=多伊,年龄=25]
System.out.println("地址:" 地址); // 地址[街道=123 Main St,城市=纽约,州=纽约]
}

这里,模式变量“fn”和“ln”与“Customer”记录中对应的组件名称“fName”和“lName”不同。这使得记录模式更加灵活,并避免与变量名称的任何潜在冲突。

7.结论
总之,Java 记录模式提供了一种解构记录并从中提取值的便捷方法。它们在处理 instanceof 和 switch 语句中的模式匹配时使代码更加简洁、干净和可读。记录模式与记录析构函数相结合,可以更稳健地处理复杂记录。总体而言,此功能增强了记录作为数据载体的使用,并使 Java 编程变得更加愉快。

开发人员可以通过使用 MyExamCloud 的 1Z0-830 练习测试学习 SE 21 开发人员认证专业考试来发现更多 Java 21 功能。

版本声明 本文转载于:https://dev.to/myexamcloud/exploring-java-record-patterns-and-pattern-matching-3g8l?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何克服PHP的功能重新定义限制?
    如何克服PHP的功能重新定义限制?
    克服PHP的函数重新定义限制在PHP中,多次定义一个相同名称的函数是一个no-no。尝试这样做,如提供的代码段所示,将导致可怕的“不能重新列出”错误。 但是,PHP工具腰带中有一个隐藏的宝石:runkit扩展。它使您能够灵活地重新定义函数。 runkit_function_renction_re...
    编程 发布于2025-07-02
  • 如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    将pandas dataframe列转换为dateTime格式示例:使用column(mycol)包含以下格式的以下dataframe,以自定义格式:})指定的格式参数匹配给定的字符串格式。转换后,MyCol列现在将包含DateTime对象。 date oped filtering > = p...
    编程 发布于2025-07-02
  • 如何在鼠标单击时编程选择DIV中的所有文本?
    如何在鼠标单击时编程选择DIV中的所有文本?
    在鼠标上选择div文本单击带有文本内容,用户如何使用单个鼠标单击单击div中的整个文本?这允许用户轻松拖放所选的文本或直接复制它。 在单个鼠标上单击的div元素中选择文本,您可以使用以下Javascript函数: function selecttext(canduterid){ if(do...
    编程 发布于2025-07-02
  • CSS可以根据任何属性值来定位HTML元素吗?
    CSS可以根据任何属性值来定位HTML元素吗?
    靶向html元素,在CSS 中使用任何属性值,在CSS中,可以基于特定属性(如下所示)基于特定属性的基于特定属性的emants目标元素: 字体家庭:康斯拉斯(Consolas); } 但是,出现一个常见的问题:元素可以根据任何属性值而定位吗?本文探讨了此主题。的目标元素有任何任何属性值,属...
    编程 发布于2025-07-02
  • Java中如何使用观察者模式实现自定义事件?
    Java中如何使用观察者模式实现自定义事件?
    在Java 中创建自定义事件的自定义事件在许多编程场景中都是无关紧要的,使组件能够基于特定的触发器相互通信。本文旨在解决以下内容:问题语句我们如何在Java中实现自定义事件以促进基于特定事件的对象之间的交互,定义了管理订阅者的类界面。以下代码片段演示了如何使用观察者模式创建自定义事件: args)...
    编程 发布于2025-07-02
  • 在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在JTable中维护jtable单元格渲染后,在JTable中,在JTable中实现自定义单元格渲染和编辑功能可以增强用户体验。但是,至关重要的是要确保即使在编辑操作后也保留所需的格式。在设置用于格式化“价格”列的“价格”列,用户遇到的数字格式丢失的“价格”列的“价格”之后,问题在设置自定义单元格...
    编程 发布于2025-07-02
  • 您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    在javascript console 中显示颜色是可以使用chrome的控制台显示彩色文本,例如红色的redors,for for for for错误消息?回答是的,可以使用CSS将颜色添加到Chrome和Firefox中的控制台显示的消息(版本31或更高版本)中。要实现这一目标,请使用以下模...
    编程 发布于2025-07-02
  • 如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    为有效的slug生成首先,该函数用指定的分隔符替换所有非字母或数字字符。此步骤可确保slug遵守URL惯例。随后,它采用ICONV函数将文本简化为us-ascii兼容格式,从而允许更广泛的字符集合兼容性。接下来,该函数使用正则表达式删除了不需要的字符,例如特殊字符和空格。此步骤可确保slug仅包含...
    编程 发布于2025-07-02
  • PHP阵列键值异常:了解07和08的好奇情况
    PHP阵列键值异常:了解07和08的好奇情况
    PHP数组键值问题,使用07&08 在给定数月的数组中,键值07和08呈现令人困惑的行为时,就会出现一个不寻常的问题。运行print_r($月)返回意外结果:键“ 07”丢失,而键“ 08”分配给了9月的值。此问题源于PHP对领先零的解释。当一个数字带有0(例如07或08)的前缀时,PHP将其...
    编程 发布于2025-07-02
  • 如何使用不同数量列的联合数据库表?
    如何使用不同数量列的联合数据库表?
    合并列数不同的表 当尝试合并列数不同的数据库表时,可能会遇到挑战。一种直接的方法是在列数较少的表中,为缺失的列追加空值。 例如,考虑两个表,表 A 和表 B,其中表 A 的列数多于表 B。为了合并这些表,同时处理表 B 中缺失的列,请按照以下步骤操作: 确定表 B 中缺失的列,并将它们添加到表的末...
    编程 发布于2025-07-02
  • 如何限制动态大小的父元素中元素的滚动范围?
    如何限制动态大小的父元素中元素的滚动范围?
    在交互式接口中实现垂直滚动元素的CSS高度限制问题:考虑一个布局,其中我们具有与用户垂直滚动一起移动的可滚动地图div,同时与固定的固定sidebar保持一致。但是,地图的滚动无限期扩展,超过了视口的高度,阻止用户访问页面页脚。$("#map").css({ marginT...
    编程 发布于2025-07-02
  • 在Ubuntu/linux上安装mysql-python时,如何修复\“ mysql_config \”错误?
    在Ubuntu/linux上安装mysql-python时,如何修复\“ mysql_config \”错误?
    mysql-python安装错误:“ mysql_config找不到”“ 由于缺少MySQL开发库而出现此错误。解决此问题,建议在Ubuntu上使用该分发的存储库。使用以下命令安装Python-MysqldB: sudo apt-get安装python-mysqldb sudo pip in...
    编程 发布于2025-07-02
  • 表单刷新后如何防止重复提交?
    表单刷新后如何防止重复提交?
    在Web开发中预防重复提交 在表格提交后刷新页面时,遇到重复提交的问题是常见的。要解决这个问题,请考虑以下方法: 想象一下具有这样的代码段,看起来像这样的代码段:)){ //数据库操作... 回声“操作完成”; 死(); } ?> ...
    编程 发布于2025-07-02
  • 如何同步迭代并从PHP中的两个等级阵列打印值?
    如何同步迭代并从PHP中的两个等级阵列打印值?
    同步的迭代和打印值来自相同大小的两个数组使用两个数组相等大小的selectbox时,一个包含country代码的数组,另一个包含乡村代码,另一个包含其相应名称的数组,可能会因不当提供了exply for for for the uncore for the forsion for for ytry...
    编程 发布于2025-07-02

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3