首页 > 编程语言 >Java 21 新特性:Record Patterns

Java 21 新特性:Record Patterns

时间:2023-09-21 12:33:57浏览次数:34  
标签:Java 21 record int Point Record WindowFrame obj

Record Patterns 第一次发布预览是在JDK 19、随后又在JDK 20中进行了完善。现在,Java 21开始正式推出该特性优化。下面我们通过一个例子来理解这个新特性。

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);
    }
}

上述代码中定义了一个名为Point的record类(Java 16中的新特性),如果我们想要获取、操作或者打印Point中的x和y的话。就不得不先完成类型判断和类型转换。所以,这里为了实现x+y总共需要4行代码。而在Java 21之后,只需要2行代码就能完成:

static void printSum(Object obj) {
    if (obj instanceof Point(int x, int y)) {
        System.out.println(x+y);
    }
}

可以看到,类型判断、类型转换、record值的结构都一气呵成了,所以代码量得到了简化。

嵌套record的解构

假设有下面一组嵌套的record结构(WindowFrame中包含了PointSize):

record Size(int width, int height) { }
record Point(int x, int y) { }
record WindowFrame(Point origin, Size size) { }

这个时候,如果想要访问WindowFrameSize的height,根据之前案例的理解,我们可以这样写:

if (obj instanceof WindowFrame wf) {
  if (wf.size() != null) {
    System.out.println("Height: " + wf.size().height());
  }
}

好像也没有很简单,但实际上还有更简单的写法,因为record的解构是可以嵌套的,直接这样一步完成即可:

if (obj instanceof WindowFrame(Point origin, Size(int width, int height))) {
    System.out.println("Height: " + height);
}

是不是一下感受到这个新特性的强大了?如果您学习过程中如遇困难?可以加入我们超高质量的技术交流群,参与交流与讨论,更好的学习与进步!另外,不要走开,关注我!持续更新Java新特性专栏

欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源

标签:Java,21,record,int,Point,Record,WindowFrame,obj
From: https://www.cnblogs.com/didispace/p/17719666.html

相关文章

  • 【230921-3】指数比较大小:5^100 vs 2^234
    ......
  • 【230921-5】▲ABC中,b=5,a=3,Cos(B-A)=7/9. 求:S△ABC=?
    ......
  • 【230921-4】▲ABC中,a=1,b=2,CosB=1/4,则c=?,S△ABC=?
    ......
  • Java实战:大文件分片上传与断点续传策略及其实际应用
    在许多应用场景中,处理大型文件上传可能成为开发人员面临的一项挑战。在网络环境不稳定,或者文件体积过大的情况下,传统的文件上传方式可能会出现问题。这时,文件分片上传和断点续传技术就显得至关重要。本文将向您展示如何使用Java实现这两种技术,并探讨其主要应用场景。文件分片上传......
  • centos中自带java的路径配置
    centos自带的java,可以直接运行java,但不知道是怎么访问到的,所以就查了一下[root@aaa]#java-versionopenjdkversion"1.8.0_262"OpenJDKRuntimeEnvironment(build1.8.0_262-b10)OpenJDK64-BitServerVM(build25.262-b10,mixedmode)查看版本号,可以看到能访问ja......
  • 921打卡
    1.N字形变换(06)将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z字形排列。比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:PAHNAPLSIIGYIR之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNA......
  • Java 的值传递与引用传递
     实参与形参我们都知道,在Java中定义方法的时候是可以定义参数的。比如Java中的main方法,publicstaticvoidmain(String[]args),这里面的args就是参数。参数在程序语言中分为形式参数和实际参数。形式参数:是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时......
  • Java字符串转换为日期和时间比较大小
    方法一:DateFormatfmt=newSimpleDateFormat("yyyy-MM-dd");StringdateBegin=fmt.format(carrierCommand.getDateBegin());StringdateEnd=fmt.format(carrierCommand.getDateEnd());//如果获得的日期格式不是'2008-05-22',就必须要格式化一下日期StringdateBegin=......
  • java并发
    符合死锁的四个条件:互斥条件:一个时刻一个线程一个资源请求与保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放。不剥夺条件:线程已获得的资源,在未用完之前,不能被其他线程剥夺。循环等待条件:若干线程形成头尾相接的循环等待资源关系。如何预防和避免线程死......
  • 4.5 Java创建一个学生类
    创建一个表示学生的实体类Student,其中有学生姓名、性别和年龄信息。要求使用属性来表示学生信息,最终编写测试代码。首先定义一个名为Student的类,代码如下: 1publicclassStudent{2//学生类3} 在类中通过属性定义学生、性别和年龄,代码如下:1publicclassSt......