新特性Record最全用法总结---动力节点总结

目录

0、有用的新特性

一、Record

1.1、Record的介绍:

1.2、Record的声明:

1.3、Record的创建:

1.4、Record使用举例:

1.5、Record-实例方法、静态方法

1.6、Record-三类构造方法

1.6.1、紧凑型构造、定制构造方法:

1.6.2、测试一下:

1.7、Record和Lombok的对比:

1.8、Record类型实现接口

1.8.1、step1: 创建接口,定义一个抽象方法:

1.8.2、step2: 创建Record 实现接口:

1.8.3、step3:测试方法::

1.9、Local Record:

1.10、嵌套Record:

1.11、 instanceof 判断 Record 类型

1.12、Switch、Record、yield实现复杂计算举例:

0、有用的新特性

        JDK8-19 新增了不少新特性,这里我们把实际常用的新特性,给大家介绍一下,包括以下几个方面:

  • Java Record
  • Swich 开关表达式
  • Text Block 文本块
  • var 声明局部变量
  • sealed 密封类

一、Record

1.1、Record的介绍:

        Java14 中预览的新特性叫做 Record,在 Java 中,Record 是一种特殊类型的 Java 类。可用来创建不可变类,例如这个类中的属性值,一经赋值后不可再改变了。

        任何时候创建 Java 类,都会创建大量的样板(样例)代码,我们可能会使用Lombok简化:

  •  每个字段的 set,get 方法
  • 公共的构造方法
  • 重写 hashCode, toString(), equals()方法

        Lombok是通过插件和预编译的方式实现的,不是语言级别的,而Record是语言级别的Lombok,可以使用Record代替Lombok, 简化样例代码的编写、简化开发,如下特点:

  1. 带有全部参数的构造方法
  2. public 访问器:属性的访问是通过公共的方法
  3. 在编译Record过程中,会生成toString(),hashCode(),equals()等方法
  4. 没有遵循 Bean 的命名规范,无 set,get 方法
  5. 类以及所有的属性都是final修饰的, Record不能被继承,Record 为隐士的 final 类。除此之外与普通类一样
  6. 不可变类,不能被继承,通过构造创建 Record
  7. final 属性,能读它的属性,但是不可修改
  8. 不能声明实例属性,能声明 static 静态成员

1.2、Record的声明:

Record是JDK14的特性,所以你的jdk语言级别必须是14以上,否则就没有Record选项:

 现在就有了:

        Record是用来作为数据的载体,存储数据用的,创建方式如下:

public record Student(Integer id,String name,String email,Integer age) {
    //1、小括号里面是它的构造方法
    //2、使用record关键字,代表Student它是一个record类型
    //3、不需要做其它的任何操作,record类型就创建好了,包含四个属性


}

    1、小括号里面是它的构造方法
    2、使用record关键字,代表Student它是一个record类型
    3、不需要做其它的任何操作,record类型就创建好了,包含四个属性

我们现在来单元测试一下,alt+回车:

1.3、Record的创建:

创建Record对象和创建普通的java对象一模一样:

public class StudentTest {
    @Test
    public void testRecord() {
        Student lisi = new Student(1001,"lisi","lisi@qq.com",20);
        //Student[id=1001, name=lisi, email=lisi@qq.com, age=20] 
        System.out.println(lisi);
    }
}

         现在lisi这个对象,他的四个属性是固定好的了,只能读取,无法修改!现在我如何来读取他的四个属性呢,注意:

        1、Record类型没有遵循Java Bean 的命名规范,无 set,get 方法,我们通过Public访问器来获取属性值;

        2、因为没有set方法,所以通过Record创建的对象,属性值是不可变的,这样Record对象在使用上也就更加安全; 

        3、Record重写了hashCode, toString(), equals()方法,你输出lisi,其实是调用的lisi.toString()方法;

public class StudentTest {
    @Test
    public void testRecord() {
        Student lisi = new Student(1001,"lisi","lisi@qq.com",20);
        //Student[id=1001, name=lisi, email=lisi@qq.com, age=20]
        System.out.println(lisi);

        //无set、get方法,通过Public访问器来获取属性值,这些都是公共的方法:
        Integer id = lisi.id();
        String name = lisi.name();
        System.out.println("id =" + id);
        System.out.println("name =" + name);
    }
}

1.4、Record使用举例:

@Test
    public void testRecord() {
        Student lisi = new Student(1001,"lisi","lisi@qq.com",20);
        System.out.println("lisi:" + lisi);
        Student lifang = new Student(1002,"lifang","lifang@qq.com",22);
        System.out.println("lifang:" + lifang.toString());

        System.out.println(lifang.equals(lisi));//false
        Student lisi2 = new Student(1001,"lisi","lisi@qq.com",20);
        System.out.println(lisi2.equals(lisi));//true
        System.out.println(lisi2.age());
        System.out.println(lifang.name());
    }

        Record 是 Java 类,和普通 Java 类一样可以定义实例方法,也可以定义静态方法:

1.5、Record-实例方法、静态方法

public record Student(Integer id,String name,String email,Integer age) {
    //1、小括号里面是它的构造方法
    //2、使用record关键字,代表Student它是一个record类型
    //3、不需要做其它的任何操作,record类型就创建好了,包含四个属性

    //实例方法,concat连接字符串:
    public String concat(){
        return String.format("姓名为:%s,年龄为:%d",this.name,this.age);
    }

    //静态方法,把email转为大写:
    public static String emailToUpperCase(String email){
        return Optional.ofNullable(email).orElse("no email").toUpperCase();
    }
}
 @Test
    public void testRecord01(){
        Student lisi = new Student(1001,"lisi","lisi@qq.com",23);
        System.out.println(lisi.concat());
        System.out.println(Student.emailToUpperCase("dddd@qq.com"));
    }

1.6、Record-三类构造方法

        我们可以在 Record 中添加构造方法, 有三种类型的构造方法分别是:
                         紧凑的,规范的、定制构造方法
  • 紧凑型构造方法没有任何参数,甚至没有括号。
  • 规范构造方法是以所有成员作为参数(自带了)
  • 定制构造方法是自定义参数个数
 1.6.1、紧凑型构造、定制构造方法:
public record Student(Integer id,String name,String email,Integer age) {
    //1、小括号里面是它的构造方法
    //2、使用record关键字,代表Student它是一个record类型
    //3、不需要做其它的任何操作,record类型就创建好了,包含四个属性

    //实例方法,concat连接字符串:
    public String concat(){
        return String.format("姓名为:%s,年龄为:%d",this.name,this.age);
    }

    //静态方法,把email转为大写:
    public static String emailToUpperCase(String email){
        return Optional.ofNullable(email).orElse("no email").toUpperCase();
    }
   //紧凑型构造方法:
    public Student{
        //注意,紧凑型构造方法是没有小括号,也没有任何的参数,直接写构造方法的执行体
        System.out.println("id:" + id);
        if(id < 1){
            throw new RuntimeException("id<1 No!!");
        }

    }
    //自定义构造方法
    public Student(Integer id, String name){
        //我们在自定义构造方法中去调用全参构造方法:
        this(id,name,null,null);
    }
}
1.6.2、测试一下:

  @Test
    public void testRecord02() {
        Student student = new Student(2001,"xiaoHong");
        System.out.println("student:" + student);
    }

通过这个输出,你可以发现,它会先把紧凑型构造方法先执行, 再执行定制构造方法


如果你id传一个小于1的:


 为什么会出现这种情况呢,我们来看一下编译后的class:

  其实是进行了一个合并,把紧凑型构造方法和(规范)全参构造方法进行了合并:


public record Student(Integer id, String name, String email, Integer age) {
    public Student(Integer id, String name, String email, Integer age) {
        System.out.println("id:" + id);
        if (id < 1) {
            throw new RuntimeException("id<1 No!!");
        } else {
            this.id = id;
            this.name = name;
            this.email = email;
            this.age = age;
        }
    }

    public Student(Integer id, String name) {
        this(id, name, (String)null, (Integer)null);
    }

    public String concat() {
        return String.format("姓名为:%s,年龄为:%d", this.name, this.age);
    }

    public static String emailToUpperCase(String email) {
        return ((String)Optional.ofNullable(email).orElse("no email")).toUpperCase();
    }

    public Integer id() {
        return this.id;
    }

    public String name() {
        return this.name;
    }

    public String email() {
        return this.email;
    }

    public Integer age() {
        return this.age;
    }
}

1.7、Record和Lombok的对比:

00

1.8、Record类型实现接口

        Java Record 可以与普通类一样实现接口,重写接口的方法。
举例步骤:
   step1: 创建新的接口,定义一个规范方法。
   step2: 创建新的 Record 实现接口,重写接口的方法,实现当前 Record 有关的业务逻辑
1.8.1、step1: 创建接口,定义一个抽象方法:
public interface PrintInterface {
    //输出自定义的商品信息
    void print();
}
1.8.2、step2: 创建Record 实现接口:

          创建Record 实现接口,重写接口的方法,实现当前 Record 有关的业务逻辑:

public record ProductRecord(Integer id,String name,Integer qty) implements PrintInterface{
    @Override
    public void print() {
        StringJoiner joiner = new StringJoiner("-");
        String s = joiner.add(id.toString()).add(name).add(qty.toString()).toString();
        System.out.println("There is the shopping information:" + s);
    }
}
1.8.3、step3:测试方法::
    @Test
    public void testRecord04(){
        ProductRecord product = new ProductRecord(1001,"iphonePuls",6666);
        product.print();
    

1.9、Local Record:

        Record 可以作为局部对象使用,你可以在代码块中或者方法体中来定义Record类型并使用:

  @Test
    public void testRecord05(){
        //定义local Record:
        record SaleRecord(String saleId,String productName,Double money){};
        //创建对象:
        SaleRecord sale = new SaleRecord("S001","iphone14",6666.02);
        //SaleRecord[saleId=S001, productName=iphone14, money=6666.02]
        System.out.println(sale);
    }

1.10、嵌套Record:

       如果你需要存储更多的数据,你可以使用嵌套Record:即多个 Record 可以组合定义, 一个 Record 能够包含其他的 Record:
        我们定义 Record Customer ,存储客户信息,包含了 Address PhoneNumber 两个Record:
public record Address(String city,String add,String zipcode) {
             //城市、地址、邮编
}
public record PhoneNumber(String areaCode,String number) {
                    //区域码,电话号码
}
public record Consumer(String id, String name, PhoneNumber number,Address address) {
}

测试:

 @Test
    public void testRecord06(){
        Address address = new Address("北京","大兴区凉水河二街-8号10栋","100176");
        PhoneNumber phoneNumber = new PhoneNumber("010","400-8080-105");
        Consumer consumer = new Consumer("c10001","李四",phoneNumber,address);
        System.out.println(consumer);
        System.out.println("客户姓名为:" + consumer.name());
        System.out.println("客户联系电话为:" + consumer.number().number());
        System.out.println("客户地址为:" + consumer.address().add());

    }

1.11、 instanceof 判断 Record 类型

 

1.12、Switch、Record、yield实现复杂计算举例:

       备注:没学过新特性Switch的同学可以先看本人此篇文章:http://t.csdnimg.cn/As9Ls

@Test
    public void testSwitch01(){
        Line line = new Line(10,20);
        Rectangle rectangle = new Rectangle(20,50);
        Shape shape = new Shape(50,80);
 
        Object obj = line;
 
        int result = switch(obj){
            case Line(int x, int y)->{
                System.out.println("图象是Line,x:" + x + ", y:" + y);
                yield x + y;
            }
            case Rectangle(int w, int h)-> 2*(w + h);
            case Shape(int x, int y)->{
                System.out.println("图像是shape");
                yield x*y;
            }
            default -> 0;
        };
        System.out.println("result = " + result);
    }

        如果Object obj = new String(); 结果为:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/345297.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL的启动与连接

一、启动MySQL服务 方式一&#xff1a;进入计算机管理界面&#xff0c;点击【服务】&#xff0c;找到【MYSQL80】&#xff0c;右键开启即可 方式二&#xff1a;以管理员身份打开powershell, 输入命令net start MYSQL80. 二、连接MySQL服务 进入MySQL的安装目录中的bin目录&a…

【jetson笔记】torchaudio报错

原因是因为pip安装的包与jetson不兼容导致 自己安装或者cmake编译也会报错 需要拉取官方配置好的docker镜像 拉取docker镜像 具体容器可以看官网&#xff0c;按照自己需求拉取即可 https://catalog.ngc.nvidia.com/orgs/nvidia/containers/l4t-ml 如果其他包不需要只需要torc…

Supplier 惰性调用和 Future#get 同步等待调用结合

&#x1f4d6;一、背景介绍 关于任务异步执行&#xff0c;两个点不可避免&#xff1a;异步结果和异步回调。 而在我的工程中有这样一段代码&#xff1a;使用 CompletableFuture 进行封装&#xff0c;可以异步执行&#xff0c;异步回调&#xff0c;通过 get() 等待异步任务的结…

ArcEngine添加点要素、线要素、面要素及学习总结

基于C#的ArcEngine二次开发教程&#xff08;13&#xff09;&#xff1a;点、线、面要素的绘制_arcengine onmousedown-CSDN博客 https://www.cnblogs.com/cannel/p/11074343.html ArcEngine绘制点、线、多边形、矩形、圆形、椭圆的代码_arcengine 开发 生成矩形-CSDN博客 https…

《数学之友》期刊投稿方式投稿邮箱

《数学之友》是国家新闻出版总署批准的正规期刊&#xff0c;设置的栏目主要有&#xff1a;数学教育、教材研究、教学研究、数学建模、思想方法、数学学习、解题探索、CAI专题、复习考试、错例剖析等。从解题技巧方法、数学问题的溯源探微释疑到新课程背景下的教改教法教案&…

Qt事件处理,提升组件类

1.相关说明 1.提升组件QLabel的类&#xff0c;以实现双击功能 2.监控键盘事件&#xff0c;实现上下左右移动 3.鼠标点击获取坐标 2.相关界面 3.相关代码和操作 自定义类TMyLabel&#xff0c;父类为QLabel tmylabel.h #ifndef TMYLABEL_H #define TMYLABEL_H #include <QL…

thinkphp+vue+mysql旅游推荐攻略分享网站p0667

基于php语言设计并实现了旅游分享网站。该系统基于B/S即所谓浏览器/服务器模式&#xff0c;应用thinkphp框架&#xff0c;选择MySQL作为后台数据库。系统主要包括用户、景点信息、攻略分类、旅游攻略、门票购买、留言反馈、论坛管理、系统管理等功能模块。运行环境:phpstudy/wa…

CSC7225

CSC7225 为高性能电流模式 PWM 开关电源控制器&#xff0c;满足绿色环保标准&#xff1b;广泛适用于经济型开关电源&#xff0c;如 DVD、机顶盒、传真机、打印机、LCD 显示器等。CSC7225 采用 DIP-8 封装。 CSC7225主要特点  CSC7225内置 700V 高压功率开关管&#xff0c;外…

解读人工智能:AI时代的奇迹与担忧

随着科技的迅猛发展&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;逐渐进入人们的视野。那么&#xff0c;什么是人工智能呢&#xff1f;简单来说&#xff0c;它是一种模拟人类智能的技术&#xff0c;通过计算机系统实现人类所具备的思…

GBASE南大通用数据库GBase 8s常见问题解析 -- 查找锁会话并解锁

本文摘自GBASE南大通用社区&#xff0c;by&#xff1a;wty&#xff0c;原文请点击&#xff1a;GBase 8s常见问题 -- 查找锁会话并解锁|GBASE社区|天津南大通用数据技术股份有限公司|GBASE-致力于成为用户最信赖的数据库产品供应商 问题现象 执行SQL时报错 244: Could not do…

6.PR-AUC机器学习模型性能的常用的评估指标

PR-AUC PR-AUC&#xff0c;即精确率-召回率曲线下的面积&#xff0c;是一种用于评估分类模型性能的指标。与ROC-AUC&#xff08;接收者操作特征曲线下的面积&#xff09;不同&#xff0c;PR-AUC关注的是精确率和召回率之间的关系&#xff0c;特别适用于不平衡数据集。 精确率…

【大数据】YARN调度器及调度策略

YARN调度器 YARN负责作业资源调度&#xff0c;在集群中找到满足业务的资源&#xff0c;帮助作业启动任务&#xff0c;管理作业的生命周期。 ​ YARN技术架构 ​ 目前&#xff0c;Hadoop作业调度器主要有三种&#xff1a;先进先出调度器&#xff08;First In First Out&…

雪花算法生成ID【细糠】

目录 &#x1f9c2;1.ID生成规则 &#x1f953;2.UUID &#x1f32d;3.数据库自增主键 &#x1f37f;4.雪花算法 1.ID生成规则 1. 全局唯一2.趋势递增3.单调递增4.信息安全5.含时间戳 2.UUID UUID(Universally Unique Identifier)的标准型式包含32个16进制数字,以连字…

Windows和Linux访问不了GitHub的解决方法

一、Windows访问不了GitHub 问题描述 使用Windows访问GitHub时&#xff0c;出现如下情况&#xff0c;显示无法访问。 解决方案&#xff1a; 打开域名查询网站&#xff1a;https://tool.chinaz.com/dns 输入GitHub的域名&#xff0c;点击立即检测。 出现如下页面&#xff0c…

【51单片机】点亮第一个LED灯

目录 点亮第一个LED灯单片机 GPIO 介绍GPIO 概念GPIO 结构 LED简介软件设计点亮D1指示灯LED流水灯 橙色 点亮第一个LED灯 单片机 GPIO 介绍 GPIO 概念 GPIO&#xff08;general purpose intput output&#xff09; 是通用输入输出端口的简称&#xff0c; 可以通过软件来控制…

泥石流监测识别摄像机

泥石流监测识别摄像机是一种基于图像识别技术的监测设备&#xff0c;主要用于实时监测和识别泥石流的发生和演变过程&#xff0c;以预警和减灾为目的。这种摄像机通常采用高清晰度摄像头和图像处理系统&#xff0c;能够实时拍摄泥石流事件&#xff0c;并对图像进行处理和分析&a…

Spring Boot 整合 Camunda 实现工作流

工作流是我们开发企业应用几乎必备的一项功能&#xff0c;工作流引擎发展至今已经有非常多的产品。最近正好在接触Camunda&#xff0c;所以来做个简单的入门整合介绍。如果您也刚好在调研或者刚开始计划接入&#xff0c;希望本文对您有所帮助。如果您是一名Java开发或Spring框架…

【C++ 自写String】

CString.hpp #include <iostream> #include <string.h>#pragma warning(disable:4996) using namespace std;class CString { private:int len;char* data;public:CString():data(nullptr),len(0) {cout << "0空构造\n";}CString(const char* _da…

爬取咚漫漫画

一、数据来源分析1.确定自己的需求&#xff1a;采集哪个网站的上面的数据内容正常的访问流程&#xff1a;1.选中漫画--->目录页面 &#xff08;请求列表页面&#xff0c;获取所有的章节链接&#xff09;2.选择一个漫画内容--->漫画页面 &#xff08;请求章节链接&#xf…

Java简单程序设计

前言 Java简单的程序设计实验&#xff0c;分享记录一下。 程序题目及实现 1. 输入一个整数&#xff0c;判断是奇数还是偶数。 package java_1022;import java.util.Scanner;public class java01 {public static void main(String[] args) {int num;Scanner in new Scanner…