新特性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 {@Testpublic 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 {@Testpublic 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使用举例:

@Testpublic 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));//falseStudent lisi2 = new Student(1001,"lisi","lisi@qq.com",20);System.out.println(lisi2.equals(lisi));//trueSystem.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();}
}
 @Testpublic 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、测试一下:

  @Testpublic 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{@Overridepublic 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:测试方法::
    @Testpublic void testRecord04(){ProductRecord product = new ProductRecord(1001,"iphonePuls",6666);product.print();

1.9、Local Record:

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

  @Testpublic 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) {
}

测试:

 @Testpublic 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

@Testpublic 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(); 结果为:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器的组成

服务器的重要结构组成 家用电脑组成&#xff1a; CPU、主板、内存条、显卡、硬盘、电源、风扇、网卡、显示器、机箱、键盘鼠标等等。 CPU CPU是电脑的大脑&#xff0c; CPU发展史&#xff1a; 32 位CPU&#xff1a;最大的内存寻址地址2^32&#xff0c;大约4G的大小。 CP…

爬虫进阶之selenium模拟浏览器

爬虫进阶之selenium模拟浏览器 简介环境配置1、建议先安装conda2、创建虚拟环境并安装对应的包3、下载对应的谷歌驱动以及与驱动对应的浏览器 代码setting.py配置scrapy脚本参考中间件middlewares.py 附录&#xff1a;selenium教程 简介 Selenium是一个用于自动化浏览器操作的…

CSS 楼梯弹弹球

<template><view class="loader"></view> </template><script></script><style>body {background-color: #212121;/* 设置背景颜色为 #212121 */}.loader {position: relative;/* 设置定位为相对定位 */width: 120px;/* 设…

38-WEB漏洞-反序列化之PHPJAVA全解(下)

WEB漏洞-反序列化之PHP&JAVA全解&#xff08;下&#xff09; 一、Java中API实现二、序列化理解三、案例演示3.1、本地3.2、Java 反序列化及命令执行代码测试3.3、WebGoat_Javaweb 靶场反序列化测试3.4、2020-网鼎杯-朱雀组-Web-think_java 真题复现 四、涉及资源 一、Java中…

springboot118共享汽车管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的共享汽车管理系统 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获…

『论文阅读|2024 WACV 多目标跟踪Deep-EloU|纯中文版』

论文题目&#xff1a; Iterative Scale-Up ExpansionIoU and Deep Features Association for Multi-Object Tracking in Sports 论文特点&#xff1a; 作者提出了一种迭代扩展的 ExpansionIoU 和深度特征关联方法Deep-EIoU&#xff0c;用于体育场景中的多目标跟踪&#xff0c;旨…

基于springboot家政服务管理平台源码和论文

随着家政服务行业的不断发展&#xff0c;家政服务在现实生活中的使用和普及&#xff0c;家政服务行业成为近年内出现的一个新行业&#xff0c;并且能够成为大众广为认可和接受的行为和选择。设计家政服务管理平台的目的就是借助计算机让复杂的销售操作变简单&#xff0c;变高效…

深圳 福田区 建筑模型 su rhino

深圳 福田区 建筑模型 su rhino 只有福田区的&#xff0c;其他区的没有&#xff0c;其他市的没有 模型有skp&#xff0c;obj格式 模型如图 部分数据&#xff1a;

常用电子器件学习——三极管

三极管介绍 三极管&#xff0c;全称应为半导体三极管&#xff0c;也称双极型晶体管、晶体三极管&#xff0c;是一种电流控制电流的半导体器件其作用是把微弱信号放大成幅度值较大的电信号&#xff0c; 也用作无触点开关。晶体三极管&#xff0c;是半导体基本元器件之一&#xf…

浅学JAVAFX布局

JAVAFX FlowPane布局 Flowpane是一个容器。它在一行上排列连续的子组件&#xff0c;并且如果当前行填充满了以后&#xff0c;则自动将子组件向下推到一行 public class FlowPanedemo extends Application {Overridepublic void start(Stage stage) throws Exception {stage.s…

肺癌相关文献6

第十四篇 Classification of lung adenocarcinoma based on stemness scores in bulk and single cell transcriptomes IF&#xff1a;6.0 中科院分区:2区 生物学WOS分区&#xff1a;Q1被引次数&#xff1a; 4 背景&#xff1a;癌细胞具有无限期自我更新和增殖的能力[2]。在一…

python基础学习-03 安装

python3 可应用于多平台包括 Windows、Linux 和 Mac OS X。 Unix (Solaris, Linux, FreeBSD, AIX, HP/UX, SunOS, IRIX, 等等。)Win 9x/NT/2000Macintosh (Intel, PPC, 68K)OS/2DOS (多个DOS版本)PalmOSNokia 移动手机Windows CEAcorn/RISC OSBeOSAmigaVMS/OpenVMSQNXVxWorksP…

高校寝室卫生检查系统UML建模——活动图

学生查看历史的通知公告学生投诉寝室卫生检查 学生查看其他寝室的卫生情况 发起报修请求

【强化学习】QAC、A2C、A3C学习笔记

强化学习算法&#xff1a;QAC vs A2C vs A3C 引言 经典的REINFORCE算法为我们提供了一种直接优化策略的方式&#xff0c;它通过梯度上升方法来寻找最优策略。然而&#xff0c;REINFORCE算法也有其局限性&#xff0c;采样效率低、高方差、收敛性差、难以处理高维离散空间。 为…

【centos7安装docker】

背景&#xff1a; 学习docker&#xff0c;我是想做一个隔离环境&#xff0c;并且部署的话&#xff0c;希望实现自动化&#xff0c;不为安装软件而烦恼&#xff0c;保证每个人的环境一致。 2C4G内存 50G磁盘的虚拟机事先已经准备完毕。 1.查看下centos版本&#xff0c;docker要…

【大数据】Flink 系统架构

Flink 系统架构 1.Flink 组件1.1 JobManager1.2 ResourceManager1.3 TaskManager1.4 Dispatcher 2.应用部署2.1 框架模式2.2 库模式 3.任务执行4.高可用设置4.1 TaskManager 故障4.2 JobManager 故障 Flink 是一个用于状态化并行流处理的分布式系统。它的搭建涉及多个进程&…

aop介绍

AOP&#xff08;Aspect-Oriented Programming&#xff0c;面向方面编程&#xff09;&#xff0c;可以说是OOP&#xff08;Object-Oriented Programing&#xff0c;面向对象编程&#xff09;的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构&#xff0c;用…

代码随想录算法训练营第14天 | 二叉树的前序、中序、后序遍历(递归+迭代法)

二叉树的理论基础&#xff1a;&#xff08;二叉树的种类&#xff0c;存储方式&#xff0c;遍历方式 以及二叉树的定义&#xff09; https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 二叉树的递归遍历 Leetcode对应的三道习…

我们应该解决哪些计算机网络中的问题,才能实现进程之间基于网络的通信呢?

ps&#xff1a;本文章的图片内容来源都是来自于湖科大教书匠的视频&#xff0c;声明&#xff1a;仅供自己复习&#xff0c;里面加上了自己的理解 这里附上视频链接地址&#xff1a;1.6 计算机网络体系结构&#xff08;1&#xff09;—常见的计算机网络体系结构_哔哩哔哩_bilibi…

what is `ContentCachingRequestWrapper` does?

ContentCachingRequestWrapper 是 Spring Framework 中提供的一种包装类&#xff0c;它扩展了 HttpServletRequestWrapper 类&#xff0c;用于缓存请求体的内容。 通常在处理 HTTP 请求时&#xff0c;原生的 HttpServletRequest 对象中的输入流 (getInputStream()) 只能被读取一…