Java 21 新特性的扫盲级别初体验

news/发布时间2024/5/15 5:00:27

一、前言

JDK 21 于 2023 年 9 月发布,作为目前讨论热度最高的JDK,虽然大家都开玩笑说你发任你发,我用Java8,但是作为一个Javaer,对JDK21的新特性还是要有所了解的。

以下是 JDK 21 的新功能列表:

  • 虚拟线程
  • 序列集合
  • 记录模式
  • 字符串模板(预览)
  • 未命名模式和变量(预览)
  • 未命名类和实例主要方法(预览)
  • 作用域值(预览)
  • 结构化并发(预览)

JDK21下载地址:JDK官网

在这里插入图片描述

安装过程在这里就不赘述了,正常【下一步】就行了。

二、新特性体验

1. switch 模式匹配

可以通过switch表达式和语句的模式匹配来增强Java编程语言,可以针对多个模式测试表达式,每个模式都有一个特定的操作,从而可以简洁、安全地表达复杂的面向数据的查询。

1.1 支持返回值,不用写break

示例代码:

public class SwitchTest {public static void main(String[] args) {String unit = "cm";String str = switch (unit) {case "cm" -> "厘米";case "m" -> "米";case "mm" -> "毫米";case "km" -> "千米";default -> "错误";};System.out.println(str);}
}

测试结果:

在这里插入图片描述

注意:如果执行结果乱码,可以参考如下操作进行:

  1. 增加VM参数

    在这里插入图片描述

  2. 修改文件编码

    在这里插入图片描述

1.2 如果需要执行多行代码再返回,可使用yield关键字

示例代码:

public class SwitchTest {public static void main(String[] args) {String unit = "cm";String str = switch (unit) {case "cm" -> {System.out.println("我在测试呢...");yield "厘米";}case "m" -> "米";case "mm" -> "毫米";case "km" -> "千米";default -> "错误";};System.out.println(str);}
}
1.3 多值匹配

示例代码:

public class SwitchTest {public static void main(String[] args) {String unit = "cm";String str = switch (unit) {case "cm", "m" -> "厘米";case "mm" -> "毫米";case "km" -> "千米";default -> "错误";};System.out.println(str);}
}
1.4 null值处理

示例代码:

public class SwitchTest {public static void main(String[] args) {String unit = null;String str = switch (unit) {case "cm", "m" -> "厘米";case "mm" -> "毫米";case "km" -> "千米";case null -> "未知";default -> "错误";};System.out.println(str);}
}
1.5 匹配增强

示例代码:

public class SwitchTest {public static void main(String[] args) {Double obj = 0.0d;String str = switch (obj) {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        -> obj.toString();};System.out.println(str);}
}

2. 记录模式

记录模式,也就是记录模式匹配,英文为“Record Patterns”,记录模式匹配是指自动匹配Record记录类,从而简化代码。Record记录会自动生成了构造函数、getter、equals、hashCode、toString等方法,简化代码的编写,类似于lombok插件的@Data注解,但是对象属性只读,只有get方法,没有set方法。

  • 使用class

    public class User {private String name;private Integer age;public User(String name, Integer age) {this.name = name;this.age = age;}public String getName() {return name;}public Integer getAge() {return age;}}
    
  • 使用record

    public record User(String name, Integer age) {
    }
    

3. 字符串模板

示例代码:

public class StrTest {public static void main(String[] args) {String name = "JDK21";String message = STR."Hello \{name}!";System.out.println(message);}
}

注意这是预览功能,默认禁用,我们需要使用--enable-preview启用字符串模板。

在Idea中,我们需要额外设置:

在这里插入图片描述

--enable-preview --source 21 -Xlint:preview

4. 顺序集合

SequencedSet 接口对于具有有序元素的 Set 非常有用,特别是当您必须执行某些操作(例如检索或删除第一个或最后一个索引处的元素)时。它还提供了一种反转元素的方法。

  • List

    import java.util.LinkedHashSet;
    import java.util.SequencedSet;public class ListTest {public static void main(String[] args) {SequencedSet<String> values = new LinkedHashSet<>();values.add("one");values.add("two");System.out.println(values); // [one, two]values.addFirst("zero");System.out.println(values); // [zero, one, two]values.addFirst("one");System.out.println(values); // [one, zero, two]values.addLast("three");System.out.println(values); // [one, zero, two, three]SequencedSet<String> reversedSet = values.reversed();System.out.println(reversedSet); // [three, two, zero, one]}
    }
    
  • Map

    import java.util.LinkedHashMap;
    import java.util.Map;
    import java.util.SequencedMap;public class MapTest {public static void main(String[] args) {SequencedMap<String, Integer> myMap = new LinkedHashMap<>();myMap.put("one", 1);myMap.put("two", 2);System.out.println(myMap); // {one=1, two=2}Map.Entry<String, Integer> firstEntry = myMap.firstEntry();System.out.println(firstEntry); // one=1Map.Entry<String, Integer> lastEntry = myMap.lastEntry();System.out.println(lastEntry); // two=2myMap.putFirst("zero", 0);System.out.println(myMap); // {zero=0, one=1, two=2}myMap.putFirst("one", -1);System.out.println(myMap); // {one=-1, zero=0, two=2}Map.Entry<String, Integer> polledFirstEntry = myMap.pollFirstEntry();System.out.println(polledFirstEntry); // one=-1System.out.println(myMap); // {zero=0, two=2}SequencedMap<String, Integer> reversedMap = myMap.reversed();System.out.println(reversedMap); // {two=2, zero=0}}
    }
    

5. 虚拟线程

虚拟线程是Jdk21的重头戏,从 Java 代码的角度来看,虚拟线程感觉就像普通线程,但它们没有 1:1 映射到操作系统/平台线程。它是从虚拟线程到载体线程进而到操作系统线程的M:N映射。

虚拟线程的一些优点:

  • 提高应用程序吞吐量

  • 提高应用程序可用性

  • 减少内存消耗

示例代码:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class VirtualThreadsTest {public static void main(String[] args) {ExecutorService executor =  Executors.newVirtualThreadPerTaskExecutor();for (int i = 0; i < 10; i++) {int taskId = i;executor.execute(() -> {System.out.println("Task " + taskId + " is running on virtual thread: " + Thread.currentThread().getName());});}try {Thread.sleep(2000L);} catch (InterruptedException e) {e.printStackTrace();}executor.shutdown();}}

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

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

相关文章

下一代Windows系统曝光:基于GPT-4V,Agent跨应用调度,代号UFO

下一代Windows操作系统提前曝光了&#xff1f;&#xff1f; 微软首个为Windows而设的智能体&#xff08;Agent&#xff09; 亮相&#xff1a; 基于GPT-4V&#xff0c;一句话就可以在多个应用中无缝切换&#xff0c;完成复杂任务。整个过程无需人为干预&#xff0c;其执行成功…

【AI编程】——使用ChatGPT实现C++贪吃蛇

User 我想使用C写一个贪吃蛇小游戏以下是ChatGPT的回答 为了创建一个贪吃蛇小游戏&#xff0c;我们将遵循以下步骤来组织我们的计划&#xff1a; 初始化游戏环境&#xff1a; 设置游戏窗口大小。初始化蛇的起始位置。放置初始食物。 游戏循环逻辑&#xff1a; 处理用户输入。…

sql报错注入 之 floor 函数报错:主键重复

Mysql报错注入之floor报错详解 updatexml extractvalue floor 是mysql的函数 groupbyrandfloorcount 一、简述 利用 select count(*),(floor(rand(0)*2))x from table group by x&#xff0c;导致数据库报错&#xff0c;通过 concat 函数&#xff0c;连接注入语句与 floor…

【JavaEE】网络原理: UDP协议和TCP协议的相关内容

目录 1. 应用层 2. 传输层 2.1 端口号 2.2 UDP协议 2.3 TCP协议 1.确认应答 2.超时重传 3.连接管理 三次握手 四次挥手 状态转换 4.滑动窗口 5.流量控制 6.拥塞控制 7.延迟应答 8.捎带应答 9.面向字节流 粘包问题 10.异常情况 网络通信中, 协议是一个非常重…

75.SpringMVC的拦截器和过滤器有什么区别?执行顺序?

75.SpringMVC的拦截器和过滤器有什么区别&#xff1f;执行顺序&#xff1f; 区别 拦截器不依赖与servlet容器&#xff0c;过滤器依赖与servlet容器。拦截器只能对action请求(DispatcherServlet 映射的请求)起作用&#xff0c;而过滤器则可以对几乎所有的请求起作用。拦截器可…

比特币原生 L2 解决方案 Merlin Chain梅林链科普(bitget wallet)

什么是梅林链&#xff1f; Merlin Chain 是由 Bitmap Tech&#xff08;以前称为 Recursiverse&#xff09;背后的团队开发的比特币第 2 层解决方案。 Merlin Chain 专注于利用比特币的独特属性&#xff0c;旨在释放其未开发的潜力。从技术上来说&#xff0c;梅林链集成了零知识…

【数学建模入门】

数学建模入门 数学建模需要的学科知识怎么学习数学模型如何读好一篇优秀论文数学建模赛题常见类别数学建模常见问题数学建模组队和分工数学建模准备工作 数学建模需要的学科知识 怎么学习数学模型 &#x1f4a6;推荐阅读书籍&#xff1a; 《数学建模算法与应用》&#xff0c;…

AI时代Python金融大数据分析实战:ChatGPT让金融大数据分析插上翅膀

目录 引言 1. Python在股票市场分析中的应用 2. 投资组合优化 3. 风险管理与预测 时间序列分析 机器学习在风险预测中的应用 大数据分析与风险建模 总结 ⭐️ 好书推荐 【内容简介】 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默…

【嵌入式】CAN总线

1 简介 CAN 是控制器局域网络 (Controller Area Network) 的简称,它是由研发和生产汽车电子产品著称的德国 BOSCH 公司开发的,并最终成为国际标准(ISO11519),是国际上应用最广泛的现场总线之一。 CAN 总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线…

专业140+总分420+浙江大学842信号系统与数字电路考研经验电子信息与通信,真题,大纲,参考书。

今年考研已经结束&#xff0c;初试专业课842信号系统与数字电路140&#xff0c;总分420&#xff0c;很幸运实现了自己的目标&#xff0c;被浙大录取&#xff0c;这在高考是想都不敢想的学校&#xff0c;在考研时实现了&#xff0c;所以大家也要有信心&#xff0c;通过自己努力实…

LeetCode42.接雨水(单调栈)

题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 &#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,…

解线性方程组(一)——克拉默法则求解(C++)

克拉默法则 解线性方程组最基础的方法就是使用克拉默法则&#xff0c;需要注意的是&#xff0c;该方程组必须是线性方程组。 假设有方程组如下&#xff1a; { a 11 x 1 a 12 x 2 ⋯ a 1 n x n b 1 a 21 x 1 a 22 x 2 ⋯ a 2 n x n b 2 ⋯ ⋯ ⋯ a n 1 x 1 a n 2 x 2…

阿赵UE学习笔记——15、灯光的移动性概念和构建光照信息

阿赵UE学习笔记目录   大家好&#xff0c;我是阿赵。   继续学习虚幻引擎&#xff0c;这次来学习一下UE里面灯光的移动性概念和构建光照信息。 1、灯光移动性 打开一个带有灯光的场景 在大纲面板里面找到其中一个灯光&#xff1a; 会发现灯光的细节面板里面&#xff0c;…

Java设计模式-结构型-适配器模式

Java设计模式-结构型-适配器模式 一、概述 ​ 与电源适配器相似&#xff0c;在适配器模式中引入了一个被称为适配器(Adapter)的包装类&#xff0c;而它所包装的对象称为适配者(Adaptee)&#xff0c;即被适配的类。适配器的实现就是把客户类的请求转化为对适配者的相应接口的调…

《Solidity 简易速速上手小册》第2章:搭建 Solidity 开发环境(2024 最新版)

文章目录 2.1 安装和配置 Solidity2.1.1 基础知识解析安装 Solidity 编译器配置开发环境熟悉命令行工具 2.1.2 重点案例&#xff1a;配置本地开发环境案例 Demo&#xff1a;配置本地 Solidity 环境案例代码&#xff1a;HelloWorld.sol 2.1.3 拓展案例 1&#xff1a;设置 Remix …

OpenHarmony—UIAbility组件间交互(设备内)

UIAbility是系统调度的最小单元。在设备内的功能模块之间跳转时&#xff0c;会涉及到启动特定的UIAbility&#xff0c;该UIAbility可以是应用内的其他UIAbility&#xff0c;也可以是其他应用的UIAbility&#xff08;例如启动三方支付UIAbility&#xff09;。 本章节将从如下场…

PDF合并工具

简单的PDF合并工具 简述 为了帮助同事做报销&#xff0c;就临时用 Python 使用 PDF 库打包了一个PDF文件合并工具&#xff0c;这个虽然对于很多程序员来说都是很简单的事情&#xff0c;但是对于一些不是很了解计算机技术的人确实是一个很尴尬的功能。 很多 PDF 编辑软件的这个…

《汇编语言》- 读书笔记 - 实验 10 编写子程序

《汇编语言》- 读书笔记 - 实验 10 编写子程序 1. 显示字符串问题子程序描述 show_str提示结果演示 2. 解决除法溢出的问题问题子程序描述 divdw提示结果演示 3. 数值显示问题子程序描述 dtoc提示结果演示 在这次实验中&#xff0c;我们将要编写3个子程序&#xff0c;通过它们来…

【MySQL】多表关系的基本学习

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-3oES1ZdkKIklfKzq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

【GO语言卵细胞级别教程】05.项目创建和函数讲解

感谢&#xff01;点点赞和评论呀&#xff01;我将继续更新 目录&#xff1a; 感谢&#xff01;点点赞和评论呀&#xff01;我将继续更新0.创建项目1.函数的引入2.注意事项3.详细介绍3.1 形参介绍 4.导入包4.1 基本知识4.2 注意事项 5.init函数6.匿名函数 0.创建项目 创建目录 …
推荐文章