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

一、前言

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.mzph.cn/news/691023.shtml

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

相关文章

element-plus日期选择器2次封装

预期效果 官网默认样式&#xff1a; 修改后的样式&#xff1a; 代码实现 DatePicker.vue <template><div class"date-picker-container"><el-date-picker v-model"date" change"handleChange" type"date" value-for…

CMake无Name和Value部分界面

鼠标会变成以下 拉开后就 出现想要的部分

PTA-九九乘法表

从键盘输入n&#xff08;n为1~9&#xff09;&#xff0c;输出九九乘法表的前n行&#xff0c;每个式子按“a * b c”形式输出&#xff0c;其中a和b各占1位列宽&#xff0c;c占4位列宽并左对齐。 输入格式: 一个1~9之间的整数n&#xff0c;如&#xff1a;9 输出&#xff1a; …

vue3项目配置按需自动引入自定义组件unplugin-vue-components

我们通常在项目中&#xff0c;需要手动引入自定义的各种组件&#xff0c;如果涉及的页面功能比较多的话&#xff0c;光是import的长度都能赶上春联了。 如果&#xff0c;能有一个插件帮我们实现自动引入&#xff0c;是不是要谢天谢地了呢&#xff1f; 接下来就进入我们的主角u…

centos中安装go

安装过程 &#xff08;1&#xff09;源码二进制下载地址 wget https://dl.google.com/go/go1.13.5.linux-amd64.tar.gz &#xff08;2&#xff09;将下载的二进制包解压至 /usr/local目录。 tar -C /usr/local/ -xzf go1.13.5.src.tar.gz &#xff08;3&#xff09;设置环…

XR行业首家|李未可科技通过深度合成服务算法备案

2月18日&#xff0c;国家网信办发布第四批深度合成服务算法备案。 根据《互联网信息服务深度合成管理规定》第十九条规定&#xff0c;具有舆论属性或者社会动员能力的深度合成服务提供者&#xff0c;应当按照《互联网信息服务算法推荐管理规定》履行备案和变更、注销备案手续。…

人工智能_普通服务器CPU_安装清华开源人工智能AI大模型ChatGlm-6B_003---人工智能工作笔记0098

前面的环境安装差不多了,这里我没有安装git,因为我认为用不到,好下面去下载算法: 首先是算法下载: https://codeload.github.com/THUDM/ChatGLM-6B/zip/refs/heads/main 算法的下载连接是这里: 可以看到下载以后得到这个ChatGLM-6B-main这个算法压缩包 然后我们再去: 然后…

Guitar Pro8最新官方破解版下载步骤教程

使用Guitar Pro 8的步骤如下&#xff1a; 安装Guitar Pro 8软件。双击打开安装包&#xff0c;按照提示完成安装过程。打开软件后&#xff0c;使用左侧工具栏上的按钮输入谱号和拍号。点击左侧工具栏的和弦图按钮&#xff0c;输入所需要的和弦。使用鼠标和键盘在乐谱中输入乐曲…

MCAL知识点(二十七):TC275如何通过GPT12实现ABZ解码

目录 1、概述 2、代码实现 1、概述 GPT12 - General Purpose Timer Unit (GPT12):通用定时器单元,具备较为灵活的定时器结构,可以用来做定时器、事件计数、脉冲宽度测量、产生PWM、频率调制、ABZ编码器增量测量。文章记录一下如何通过GPT12实现编码器ABZ信号的测量。 注意…

修复 Android 手机陷入恢复模式的 5 种方法

您的手机卡在 Android Recovery 模式且无法退出此模式&#xff1f;无论您按什么按钮组合&#xff0c;甚至在取出并重新插入电池后重新启动手机&#xff0c;手机都会启动回到恢复模式吗&#xff1f; Android卡在recovery模式的情况并不罕见&#xff0c;各种品牌的Android手机都…

极狐GitLab 如何配置多个 LDAP?

本文仅适用于极狐GitLab私有化部署场景。 场景化痛点 极狐GitLab 的多 LDAP 接入功能解决了企业在以下场景中可能遇到的痛点&#xff1a; 多个组织/部门的整合&#xff1a;在大型企业或跨国公司中&#xff0c;往往存在多个组织或部门&#xff0c;它们可能拥有独立的 LDAP 服务…

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,…

解决kkFileView4.4.0版本pdf、word不能预览问题

这里使用的是http下载流url预览&#xff0c;遇到的问题。 官方使用指南&#xff1a;kkFileView - 在线文件预览 1 前端测试代码 1.1 官方示例代码 1.2 本人测试代码 注意&#xff1a;要给预览文件的url进行编码encodeURIComponent(Base64.encode(previewUrl))。 <!DOCTYP…

Linux 驱动开发基础知识——LED 模板驱动程序的改造:设备树(十一)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;Vir2021GKBS &#x1f43c;本文由…

【4.1计算机网络】TCP-IP协议簇

目录 1.OSI七层模型2.常见协议及默认端口3.TCP与UDP的区别 1.OSI七层模型 osi七层模型&#xff1a; 1.应用层 2.表示层 3.会话层 4.传输层&#xff1a;TCP为可靠的传输层协议。 5.网络层 6.数据链路层 7.物理层 2.常见协议及默认端口 3.TCP与UDP的区别 例题1. 解析&#xff1…

Swift Combine 使用 print 操作符调试管道 从入门到精通二十四

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三Swift Combine 发布者publisher的生命周期 从入门到精通四Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五Swift Com…

零基础入门金融风控-贷款违约预测Task2 数据分析

Task2 数据分析 此部分为零基础入门金融风控的 Task2 数据分析部分&#xff0c;带你来了解数据&#xff0c;熟悉数据&#xff0c;为后续的特征工程做准备&#xff0c;欢迎大家后续多多交流。 赛题&#xff1a;零基础入门数据挖掘 - 零基础入门金融风控之贷款违约 目的&#…

css3盒子

盒子模型 一.看透网页布局本质二.认识盒子三.盒子的边框&#xff08;border&#xff09;1.概念2.简写及分开写法3.合并问题&#xff08;会相加&#xff09;4.边框会影响盒子实际大小 四.盒子的内边距&#xff08;padding&#xff09;1.概念2.简写3.内边距会影响盒子实际大小4.特…

通过VSCode开发Python项目

一、插件准备 Python 插件&#xff0c;必须 autoDocstring 生成注释&#xff0c;和Pycharm一样输入三个引号"""会生产注释结构 Todo Tree 高亮显示 TODO/FIXME 二、python相关设置 一&#xff09;设置python环境 按"F1"打开命令面板&#xff08;…

Redis第一关之常规用法

简介 Redis不用多说&#xff0c;已经火了很多年了&#xff0c;也用了很多年了。现在做一些归纳总结。 这篇文章主要介绍Redis的常规知识及用法&#xff0c;包括数据结构、使用场景、特性、过期机制、持久化机制。 Redis与Mysql Mysql是一款基于磁盘的关系型SQL数据库。 Redi…