【Java进阶篇】JDK新版本中的新特性都有哪些

在这里插入图片描述

JDK新版本中的新特性都有哪些

  • ✔️经典解析
  • ✔️拓展知识仓
    • ✔️本地变量类型推断
    • ✔️Switch 表达式
    • ✔️Text Blocks
    • ✔️Records
    • ✔️封装类
    • ✔️instanceof 模式匹配
    • ✔️switch 模式匹配
  • ✅✔️虚拟线程


✔️经典解析


JDK 8中推出了Lambda表达式、Stream、Optional、新的日期API等
JDK 9中推出了模块化
JDK 10中推出了本地变量类型推断
JDK 12中增加了switch表达式
JDK 13中增加了text block
JDK 14中增加了Records
JDK 14中增加了instance模式匹配
JDK 15中增加了封闭类
JDK 17中扩展了switch模式匹配
JDK 19中增加了协程


✔️拓展知识仓


✔️本地变量类型推断


在Java 10之前版本中,我们想定义定义局部变量时。我们需要在赋值的左侧提供显式类型,并在赋值的右边提供实现类型:


MyObject value = new MyObject();

在Java 10中,提供了本地变量类型推断的功能,可以通过var声明变量:


var value = new MyObject();

本地变量类型推断将引入“var”关键字,而不需要显式的规范变量的类型。


其实,所谓的本地变量类型推断,也是Java 10提供给开发者的语法糖。


关于语法糖,我前面有详细讲解到,也可以在博主的置顶文章看到,这里放个链接。 语法糖传送门


虽然我们在代码中使用var进行了定义,但是对于虚拟机来说他是不认识这个var的,在java文件编译成class文件的过程中,会进行解糖,使用变量真正的类型来替代var


✔️Switch 表达式


在JDK 12中引入了Switch表达式作为预览特性。并在Java 13中修改了这个特性,引入了yield语句用于返回值。


而在之后的Java 14中,这一功能正式作为标准功能提供出来。


在以前,我们想要在 switch 中返回内容,还是比较麻烦的,一般语法如下:


int i;
switch (x) {case "1":i = 1;break;case "2":i = 2;break;default:i = x.length();break;
}

在JDK13中使用以下语法:


int i = switch (x) {case "1" -> 1;case"2" -> 2;default -> {int len = args[1].length();yield len;}
};

又或者:


int i = switch (x) {case "1": yield 1;case "2": yield 2;default: {int len = args[1].length();yield len;}
};

在这之后,switch中就多了一个关键字用于跳出switch块了,那就是yield,他用于返回一个值。


return的区别在于: return会直接跳出当前循环或者方法,而yield只会跳出当前switch块。


✔️Text Blocks


Java 13中提供了一个Text Blocks的预览特性,并且在Java 14中提供了第二个版本的预览。


text block,文本块,是一个多行字符串文字,它避免了对大多数转义序列的需要,以可预测的方式自动格式化字符串,并在需要时让开发人员控制格式。


我们以前从外部copy一段文本串到Java中,会被自动转义,如有一段以下字符串:


<html><body><p>Hello,world</p></body>
</html>

将其复制到Java的字符串中,会展示成以下内容:


"<htmI>\n" +
"    <body>\n" +
"        <p>Hello,world</p>\n" +
"    <body>\n" +
"<htmI>\n";

即被自动进行了转义,这样的字符串看起来不是很直观,在JDK 13中,就可以使用以下语法了:


"""
<html><body><p>Hello,world</p></body>
</htmI>
""";

使用 """ 作为文本块的开始符合结束符,在其中就可以放置多行的字符串,不需要进行任何转义看起来就十分清爽了。


如常见的SQL语句:


String query = """SELECT `EMP_ID`,`LAST NAME` FROM `EMPLOYEE_TB`WHERE `CITY` = `INDIANAPOLIS`ORDER BY `EMP_ID`,`LAST_NAME`;""";

看起来就比较直观,清爽了。


✔️Records


Java 14 中便包含了一个新特性: EP 359: Records,


Records的目标是扩展Java语言语法,Records为声明类提供了一种紧凑的语法,用于创建一种类中是 “ 字段,只是字段,除了字段什么都没有 ” 的类。


通过对类做这样的声明,编译器可以通过自动创建所有方法并让所有字段参与 hashCode() 等方法。这是JDK 14中的一个预览特性。


使用record关键字可以定义一个记录:


record Person (String firstName,String lastName) {}

record 解决了使用类作为数据包装器的一个常见问题。纯数据类从几行代码显著地简化为一行代码。

✔️封装类


在Java 15之前,Java认为"代码重用"始终是一个终极目标,所以,一个类和接口都可以被任意的类实现或继承。


但是,在很多场景中,这样做是容易造成错误的,而且也不符合物理世界的真实规律。


例如,假设一个业务领域只适用于汽车和卡车,而不适用于摩托车。

在Java中创建Vehicle抽象类时,应该只允许Car和Truck类扩展它。


通过这种方式,我们希望确保在域内不会出现误用Vehicle抽象类的情况。


为了解决类似的问题,在Java 15中引入了一个新的特性一一密闭。


想要定义一个密闭接口,可以将sealed修饰符应用到接口的声明中。然后,permit子句指定允许实现密闭接口的类:


public sealed interface Service permits CarTruck  {}

以上代码定义了一个密闭接口Service,它规定只能被Car和Truck两个类实现。


与接口类似,我们可以通过使用相同的sealed修饰符来定义密闭类:


public abstract sealed class Vehicle permits CarTruck {}

通过密闭特性,我们定义出来的Vehicle类只能被Car和Truck继承。


✔️instanceof 模式匹配


instanceof 是Java中的一个关键字,我们在对类型做强制转换之前,会使用instanceof 做一次判断。比如:


if (animal instanceof Cat) {Cat cat = (Cat) animal;cat .miaow();
} else if (animal instanceof Dog)  {Dog dog = (Dog) animal;dog.bark();
}

Java 14带来了改进版的 instanceof 操作符,这意味着我们可以用更简洁的方式写出之前的代码例子:


if (animal instanceof Cat cat) {cat .miaow();
} else if(animal instanceof Dog dog) {dog.bark();
}

我们都不难发现这种写法大大简化了代码,省略了显式强制类型转换的过程,可读性也大大提高了。


✔️switch 模式匹配


基于 instanceof 模式匹配这个特性,我们可以使用如下方式来对对象o进行处理:


static String formatter(Object o) {String formatted = "unknown";if (o instanceof Integer i) {formatted = String.format("int %d",i);} else if (o instanceof Long l) {formatted = String.format("long %d",l);} else if (o instanceof Double d) {formatted = String.format("double %f",d);} else if (o instanceof String s) {formatted = String.format("string %s",s);}return formatted ;
}

可以看到,这里使用了很多 if-else ,其实,Java中给我们提供了一个多路比较的工具,那就是switch,而且从Java 14开始支持switch表达式,但switch的功能一直都是非常有限的。


在Java 17中,Java的工程师们扩展了switch语句和表达式,使其可以适用于任何类型,并允许case标签中不仅带有变量,还能带有模式匹配。我们就可以更清楚、更可靠地重写上述代码,例如:


static String formatterPatternSwitch(Object o) {return switch (o) {case Integer i -> String.format("int %d", i);case Long l    -> String.format("long %d",l);case Double d -> String.format("double %f",d);case String s -> String.format("string %s",s);default       -> o.tostring();};
}

可以看到,以上的switch处理的是一个 Object 类型,而且 case 中也不再是精确的值匹配,而是模式匹配了。


✅✔️虚拟线程

。。。。。。。。。。这块会以一个新模块细讲,大家元旦快乐!!!

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

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

相关文章

什么是机密计算(Confidential Compute)?

机密计算是通过在可信的硬件支持的安全环境中执行计算来保护正在使用的数据。这种保护使代码和数据免受特权软件和硬件代理的观察或修改。 在机密计算环境中执行的任何应用程序或操作系统都可以期望在与系统的其他非受信任代理隔离的情况下执行。在隔离执行期间生成或使用的任…

目标检测实例分割数据集转换:从XML和JSON到YOLOv8(txt)

yolov8导航 如果大家想要了解关于yolov8的其他任务和相关内容可以点击这个链接&#xff0c;我这边整理了许多其他任务的说明博文&#xff0c;后续也会持续更新&#xff0c;包括yolov8模型优化、sam等等的相关内容。 YOLOv8&#xff08;附带各种任务详细说明链接&#xff09; 源…

2023-12-12LeetCode每日一题(下一个更大元素 IV)

2023-12-12每日一题 一、题目编号 2454. 下一个更大元素 IV二、题目链接 点击跳转到题目位置 三、题目描述 给你一个下标从 0 开始的非负整数数组 nums 。对于 nums 中每一个整数&#xff0c;你必须找到对应元素的 第二大 整数。 如果 nums[j] 满足以下条件&#xff0c;那…

「网络编程」其他重要的协议或技术_ DNS协议 | ICMP协议 | NAT技术

「前言」文章内容是DNS协议、ICMP协议、NAT技术的讲解。 「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、DNS协议1.1 背景1.2 域名简介1.3 域名解析的过程 二、ICMP协议2.1 ICMP简介2.2 ping命令2.3 traceroute命令 三、NAT技术3.1 NAT技术背景3.2 …

【算法提升—力扣每日一刷】五日总结【12/25--12/29】

文章目录 LeetCode每五日一总结【12/25--12/29】2023/12/25今日数据结构&#xff1a;双锁实现阻塞队列 2023/12/26每日力扣&#xff1a;[215. 数组中的第K个最大元素&#xff08;堆实现&#xff09;](https://leetcode.cn/problems/kth-largest-element-in-an-array/) 2023/12/…

uniapp中的uview组件库丰富的Form 表单用法

目录 基本使用 #Form-item组件说明 #验证规则 #验证规则属性 #uView自带验证规则 #综合实战 #校验错误提示方式 #校验 基本使用 此组件一般是用于表单验证使用&#xff0c;每一个表单域由一个u-form-item组成&#xff0c;表单域中可以放置u-input、u-checkbox、u-radio…

typescript 类装饰器的执行顺序

分类&#xff1a; class 类装饰器method 方法装饰器gettersetterfield 属性装饰器accessor 存取器装饰器 装饰器的执行分为两个阶段。 &#xff08;1&#xff09;评估&#xff08;evaluation&#xff09;&#xff1a;计算符号后面的表达式的值&#xff0c;得到的应该是函数。…

伺服电机:原点复位

一、原点复位概念 原点复位指的是&#xff0c;在驱动器使能时&#xff0c;触发原点复位功能后&#xff0c;电机将主动查找零点&#xff0c;完成定位功能。 那么问题来了&#xff0c;什么是原点&#xff0c;什么是零点&#xff1f; 原点&#xff1a;即机械原点&#xff0c;可…

人机对话:2024年有什么新机遇?

人机对话&#xff1a;2024年有什么新机遇&#xff1f; 2024年有什么新机遇&#xff1f;对于这个问题&#xff0c;我咨询了几个人工智能平台&#xff0c;得出一些不同的结果。 INSCODE AI 创作助手 2024年有许多新的机遇可以追逐。以下列出了一些可能的新机遇&#xff1a; 科…

四、Mysql数据库编程[触发器、存储过程、函数]

一、数据库编程 1.触发器 解释&#xff1a;触发器&#xff08;trigger&#xff09;能够在sql里面自动执行&#xff0c;当设定好某个条件&#xff0c;当条件满足时&#xff0c;sql将自动执行某些语句 &#xff0c;其中触发器里面有关键字NEW和OLD代表修改前和修改后的值 -- 创…

基于JAVA的独居老人物资配送系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询社区4.2 新增物资4.3 查询物资4.4 查询物资配送4.5 新增物资配送 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的独居老人物资配送系统&#xff0c;包含了社区档案、…

【sql】_![CDATA[]]_和转义字符:

文章目录 一、转义字符二、<![CDATA[]]>三、<![CDATA[]]>和xml转移字符的关系&#xff0c;它们两个看起来是不是感觉功能重复了&#xff1f; 所有 XML 文档中的文本均会被解析器解析。 只有 CDATA 区段&#xff08;CDATA section&#xff09;中的文本会被解析器忽略…

RK3399平台入门到精通系列讲解(导读篇)21天挑战Linux系统开发

🚀返回总目录 文章目录 一、关于作者1、博主的联系方式2、支持二、需要具备的知识和工具1、需掌握知识点2、需了解的知识点三、通过系列博客可以学到什么1、本系列博文特色2、21天学习目标3、21天学习内容4、学习时间5、学习产出

操作系统——文件系统

分区 C盘、D盘等都是同一块硬盘上的不同分区。每个分区被操作系统视为独立的逻辑磁盘&#xff0c;它们可以有不同的文件系统、格式以及分配的存储空间。 卷 拥有文件系统的分区就叫做卷。 挂载&#xff08;mount&#xff09; 建立操作系统的逻辑地址和物理介质的物理地址之…

【解决问题】pyinstaller打包python应用进行快速分发

pyinstaller打包python应用进行快速分发 问题起因先利其器再善其事试用运行 问题起因 有同学问我要接口的应用&#xff0c;于是试了一下python打包成exe的过程。 先利其器 主要使用pyinstaller&#xff0c;可以通过pip安装 pip install pyinstaller安装过程如图 再善其事…

B+树的插入删除

操作 插入 case2的原理,非叶子节点永远和最右边的最左边的节点的值相等。 case3:的基本原理 非叶子节点都是索引节点 底层的数据分裂之后 相当于向上方插入一个新的索引(你可以认为非叶子节点都是索引),反正第二层插入160 都要分裂,然后也需要再插入(因为索引部分不需要重…

2023-12-27 LeetCode每日一题(保龄球游戏的获胜者)

2023-12-27每日一题 一、题目编号 2660. 保龄球游戏的获胜者二、题目链接 点击跳转到题目位置 三、题目描述 给你两个下标从 0 开始的整数数组 player1 和 player2 &#xff0c;分别表示玩家 1 和玩家 2 击中的瓶数。 保龄球比赛由 n 轮组成&#xff0c;每轮的瓶数恰好为…

数据分析工具 Top 8

你能想象一个没有工具箱的水管工吗? 没有,对吧? 数据从业者也是如此。如果没有他们的数据分析工具&#xff0c;数据从业者就无法分析数据、可视化数据、从数据中提取价值&#xff0c;也无法做数据从业者在日常工作中做的许多很酷的事情。 根据你最感兴趣的数据科学职业——数…

前后台分离开发

前后台分离开发 简介 前后台分离开发&#xff0c;就是在项目开发过程中&#xff0c;对于前端代码的开发由专门的前端开发人员负责&#xff0c;后端代码则由后端开发人员负责&#xff0c;这样可以做到分工明确、各司其职&#xff0c;提高开发效率&#xff0c;前后端代码并行开…

SpringBoot 日志打印

一. 自定义打印日志 开发者自定义打印日志实现步骤: • 在程序中得到日志对象 • 使用日志对象的相关语法输出要打印的内容. 得到日志对象: //日志工厂需要将需要打印的类的类型传递进去,这样我们才知道日志的归属类,才能更方便的定位到文体类 private static Logger logger …