Java 21 正式发布!新特性专栏继续更起来了~

2023-09-20 11:20:21

d6ad02d6490e7bd4a76ef04bc2c38749.jpeg

就在昨天晚间,Oracle公司宣布Java 21正式发布。该版本是继JDK 17之后最新的长期支持版本(LTS),将获得至少8年的支持!

Java 21 号称具有数千项性能、稳定性和安全性改进。新的 JDK 21 包括对 15 项改进的抢先体验,这些增强功能是在 Oracle CloudWorld 2023 会议上宣布的,包括支持虚拟线程以提高整体吞吐量,以及增加对向量应用编程接口(API)的支持,从而更轻松地构建涉及人工智能 AI 模型的 Java 应用。

相信关注DD的读者知道,去年我开过这样一个坑,后来太监了...

5fad10074207609c6737b9de89d2dc16.png

最近,趁着Java 21准备继续连载下去,把之前一大波没更新的特性和经多次完善再这次确定下来的特性再串一遍,欢迎收藏!今天先来学习两个:switch的模式匹配和Record Patterns(不知道怎么翻译好,就不翻了0eca70f26b754783757bb14ef1df102e.png

地址:https://www.didispace.com/java-features/

switch的模式匹配

其实在之前的Java 17新特性中,我们介绍过关于JEP 406: switch的模式匹配,但当时还只是关于此内容的首个预览版本。之后在JDK 18、JDK 19、JDK 20中又都进行了更新和完善。如今,在JDK 21中,该特性得到了最终确定!下面,我们就再正式学习一下该功能!

在以往的switch语句中,对于case中的类型匹配限制是很多的。比如下面这个例子中的Map中可能存储了不同类型的对象,我们要判断的时候,就只能依靠if-else来完成。

Map<String, Object> data = new HashMap<>();
data.put("key1", "aaa");
data.put("key2", 111);
if (data.get("key1") instanceof String s) {
  log.info(s);
}

if (data.get("key") instanceof String s) {
  log.info(s);
} else if (data.get("key") instanceof Double s) {
  log.info(s);
} else if (data.get("key") instanceof Integer s) {
  log.info(s);
}

现在开始,这样的类型判断关系,就可以简化为如下的switch代码:

switch (data.get("key1")) {
  case String s  -> log.info(s);
  case Double d  -> log.info(d.toString());
  case Integer i -> log.info(i.toString());
  default        -> log.info("");
}

这个功能还是非常有用的,尤其是存在一些抽象封装的时候,可能存在一些父子、兄弟等关系类的时候,为了判断是什么类型,就不用写很多if来处理了,代码简洁度可以得到进一步的优化。

对于上面的例子,还没有升级到Java 17的用户,可能还涉及一些其他新特性,有需要的可以补充学习一下:

第一个是 Java 16中的instance of增强 ; 第二个是 switch中使用Lambda的增强

这里顺手这里给大家推荐下我们自研的Youtube视频语音转换插件(https://youtube-dubbing.com/),一键外语转中文,英语不好的小伙伴也可以轻松的学习油管上的优质教程了,下面是演示视频,可以直观的感受一下:

Record Patterns

记录模式(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值的解构都一气呵成了,所以代码量得到了简化。

好了,今天的分享就到这里,欢迎关注Java新特性专栏:

https://www.didispace.com/java-features/

我们创建了一个高质量的技术交流群,与优秀的人在一起,自己也会优秀起来,赶紧点击加群,享受一起成长的快乐。

推荐阅读

··································

点击卡片关注程序猿DD,分享一线干货

更多推荐

Command not found 解决方法

前言:要更新code上服务器用GUI失败,$patch_delivery_gui,报错:patch_delivery_gui:commandnotfound,上次编TA也是这个问题写了个脚本:这个脚本会先检查ifconfig、firewall-cmd和vim命令是否可用,如果不可用,则尝试安装相应的软件包。然后,它会显

从Vue 2到Vue 3:深入了解路由配置的变化与升级建议

🎬岸边的风:个人主页🔥个人专栏:《VUE》《javaScript》⛺️生活的理想,就是为了理想的生活!目录📘前言vue2路由配置📟一、控制台安装vue路由📟二、项目src文件夹下创建router文件夹,并在router文件夹下创建index.js文件📟三、在index.js文件夹下进行vue路由配置📟四、

【云原生 | 56】Docker三剑客之Docker Swarm高效使用

🍁博主简介:🏅云计算领域优质创作者🏅2022年CSDN新星计划python赛道第一名🏅2022年CSDN原力计划优质作者🏅阿里云ACE认证高级工程师🏅阿里云开发者社区专家博主💊交流社区:CSDN云计算交流社区欢迎您的加入!目录1.创建集群id2.配置集群节点3.配置管理节点4.查看集群节点列表5.使用集群

软考 - 计算机组成与体系笔记

数据的表示进制转化二进制转十进制(十进制以D表示)从右往左,用二进制位上的数字乘以2的n次幂的和(n从0开始+1累加)十进制转二进制(二进制以B表示)十进制数不断除以2直至到0,得到的余数按从下而上的顺序排列得到的数值二进制与八进制(八进制以O或Q表示)二进制从右往左,每三位对应的都是八进制的一位数二进制与十六进制(十

LeetCode 753. 破解保险箱【欧拉回路,DFS】困难

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及

优化系统报错提示信息,提高人机交互(三)

对于业务比较复杂的接口,可能存在方法嵌套,每个方法都可能会报错,出现异常,那么需要把异常信息返回给接口调用者,如何实现呢?(1)捕获异常进行处理,不返回controller代码@AllArgsConstructor@RestController@Slf4jpublicclassDemoController{privat

Llama.cpp工具main使用手册

Llama.cpp提供的main工具允许你以简单有效的方式使用各种LLaMA语言模型。它专门设计用于与llama.cpp项目配合使用。推荐:用NSDT编辑器快速搭建可编程3D场景Llama.cpp的工具main提供简单的C/C++实现,具有可选的4位量化支持,可实现更快、更低的内存推理,并针对桌面CPU进行了优化。该程

【C++】构造函数初始化列表 ④ ( 构造函数 和 析构函数 调用顺序分析 )

文章目录一、构造函数和析构函数调用顺序说明1、构造函数调用顺序2、析构函数调用顺序3、拷贝构造函数也可以定义初始化列表二、构造函数和析构函数调用顺序代码分析1、构造函数调用顺序2、代码示例-构造/析构函数调用顺序分析构造函数初始化列表总结:初始化列表可以为类的成员变量提供初始值;初始化列表可以调用类的成员变量类型的构造

SpringBoot之静态资源规则与定制化

文章目录前言一、静态资源访问二、静态资源访问前缀三、webjar资源处理的默认规则四、welcome与favicon功能1.欢迎页支持欢迎页处理规则2.自定义Favicon五、补充总结前言本文主要介绍关于SpringBoot中Web开发的简单功能。一、静态资源访问只要静态资源放在类路径下:called/static(o

linux ssh 禁止指定用户通过ssh登录

Linux禁止用户或IP通过SSH登录限制用户SSH登录1.只允许指定用户进行登录(白名单):在/etc/ssh/sshd_config配置文件中设置AllowUsers选项,(配置完成需要重启SSHD服务)格式如下:AllowUsersaliyuntest@192.168.1.1#允许aliyun和从192.168.

洞察2023:中国心室辅助装置行业竞争格局及市场份额

本文核心数据:代表性企业排名;代表性企业优势分析等1、中国心室辅助装置行业竞争梯队人工心脏(ArtificialHeart,AH)是机械辅助类器械的代表,用于替代或辅助心脏泵血功能。按照功能可分为心室辅助装置(VentricularAssistDevice,VAD)、全人工心脏(TotalArtificialHeart

热文推荐