Java 22新特性概述

Java 22于2024年3月19日发布,共有12个特性,本节就介绍其中相对重要的9个特性:

  • JEP 447:Statements before super(...) (Preview)super(...) 之前的语句(第一次预览)

  • JEP 454:Foreign Function & Memory API 外部函数和内存 API(转正)

  • JEP 458:Launch Multi-File Source-Code Programs 启动多文件源代码程序

  • JEP 459:String Templates (Second Preview) 字符串模板(第二次预览)

  • JEP 460:Vector API (Seventh Incubator) 向量API(第七轮孵化)

  • JEP 461:Stream Gatherers (Preview) 流收集器(第一次预览)

  • JEP 462:Structured Concurrency (Second Preview) 结构化并发(第二次预览)

  • JEP 463:Implicitly Declared Classes and Instance Main Methods (Second Preview)隐式声明的类和实例 main 方法(第二次预览)

  • JEP 464:Scoped Values (Second Preview) 范围值(第二次预览)

更多内容读者可自行阅读:OpenJDK Java 22文档

一、JEP 447:super(...) 之前的语句(第一次预览)

用过super调用父类的构造函数或用this调用另一个构造函数的同学都知道,super和this的调用必须是第一行(很不人性化),如果参数有问题,那就是在作无用功,比如官方给的例子:

public class PositiveBigInteger extends BigInteger {public PositiveBigInteger(long value) {super(value);               // Potentially unnecessary workif (value <= 0)throw new IllegalArgumentException("non-positive value");}
}

这时候我们就不得不再写一个静态方法来校验参数:

public class PositiveBigInteger extends BigInteger {public PositiveBigInteger(long value) {super(verifyPositive(value));}private static long verifyPositive(long value) {if (value <= 0)throw new IllegalArgumentException("non-positive value");return value;}
}

在Java 22对这一“痛点”作了改进,并进行了首次预览,super和this的调用不再必须是第一行:

public class PositiveBigInteger extends BigInteger {public PositiveBigInteger(long value) {if (value <= 0)throw new IllegalArgumentException("non-positive value");super(value);}
}

二、JEP 454:外部函数和内存 API(转正)

该特性其实是由两个孵化API演变的:外部内存访问 API 和外部链接器 API,从孵化到转正共经历了8个Java版本。

  • 外部内存访问 API 最初由 JEP 370 提出,并于 2019 年底作为孵化 API 针对 Java 14。

  • 它在 Java 15 中由 JEP 383 和 Java 16 中的 JEP 393 重新孵化。

  • 外部链接器 API 最初由 JEP 389 提出,并于 2020 年底针对 Java 16,也是一个孵化 API。

  • 外部函数和内存(FFM)API通过 JEP 412 在 JDK 17 中孵化。

  • 并通过 JEP 419 在 JDK 18 中重新孵化。

  • 外部函数和内存(FFM)API最初是由JEP 424 (JDK 19)作为预览功能提出的。

  • 随后由 JEP 434 (JDK 20)和JEP 442 (JDK 21)进行改进。

  • 在JDK 22终于成为了正式特性。

这个在Java 19的时候介绍过,这里就不再赘述了

三、JEP 458:启动多文件源代码程序

在Java 11的时候有个单文件源代码启动的特性,就是如果运行只由一个文件组成的Java程序,就无需编译(javac命令),直接运行即可,如果是多个文件的话就需要单独编译才能运行。

Java 22引入了一个启动器,它支持运行由多个文件组成的程序,假设一个目录包含Prog.java和Helper.java两个文件:

// Prog.java
class Prog {public static void main(String[] args) { Helper.run(); }
}
​
// Helper.java
class Helper {static void run() { System.out.println("Hello!"); }
}

​运行java Prog.java会在内存编译Prog并执行其main方法,这里Prog引用了Helper类,则启动器会在文件系统查找Helper.java文件然后内存编译。

四、JEP 459:字符串模板(第二次预览)

  • 字符串模板最初是由 JDK 21 中的 JEP 430 作为预览功能提出的。

  • 此JEP建议进行第二次预览。

本次和第一次预览相比基本没有变化,可以参考Java 21对这一特性的介绍。

五、JEP 460:向量API(第七轮孵化)

  • Vector API 最初由 JEP 338 提出,并作为孵化 API 集成到 JDK 16 中。

  • JEP 414(集成到 JDK 17 中)、JEP 417 (JDK 18)、JEP 426 (JDK 19)、JEP 438 (JDK 20) 和 JEP 448 (JDK 21) 提出了更多轮次的孵化。

  • 此JEP建议进行第七轮孵化。

这个可以参考Java 16中对这一特性的介绍。

六、JEP 461:流收集器(第一次预览)

java 8引入了第一个专门为Lambda表达式设计的API:java.until.stream,不过这个API近几年来一直遭受批评,原因就是功能太少了,除了现有的filter、map、flatMap、mapMulti、distinct、sorted、peak、limit、skip、takeWhile和dropWhile之外,Java社区还希望看到window和fold等方法。

那么Java 22就来了,但是JDK开发人员没有将这些方法集成到JDK中,而是重新开发了一个API,允许开发人员编写任何中间流操作,这个API被称为“Stream Gatherers”,作为预览功能在Java 22中发布。

该API提供了一系列收集器操作,比如有windowFixed和windowSliding

void main() {List<String> list = List.of("a", "b", "c", "d", "e", "f", "g", "h");List<List<String>> windowFixed = list.stream().gather(Gatherers.windowFixed(3)).toList();System.out.println(windowFixed);//[[a,b,c],[d,e,f],[g,h]]
​List<Integer> list1 = List.of(1, 2, 3, 4, 5);List<List<String>> windowSliding = list.stream().gather(Gatherers.windowSliding(3)).toList();System.out.println(windowSliding);//[[1,2,3],[2,3,4],[3,4,5]]
}

此外还有:fold、mapConcurrent、scan等操作就不演示了。

七、JEP 462:结构化并发(第二次预览)

  • 结构化并发由 JEP 428 提出,并在 JDK 19 中作为孵化 API 提供。

  • 它在 JDK 20 中由 JEP 437 重新孵化,并进行了小幅更新以继承范围值 (JEP 429)。

  • 它首先在 JDK 21 中通过 JEP 453 进行了预览,并将 StructuredTaskScope::fork(...) 更改为返回 Subtask 而不是 Future。

  • 此JEP建议进行第二次预览。

本次没做任何更改,该特性Java 21中介绍过了,这里就不再赘述。

八、JEP 463:隐式声明的类和实例 main 方法(第二次预览)

  • JEP 445 提出了未命名类和实例主方法,在 JDK 21 中进行了预览。

  • 反馈建议该功能应在 JDK 22 中第二次预览,并进行以下重大更改,因此修改了标题。

Java 22支持了更为灵活的程序启动协议,比如允许启动类的方法有public、protected权限,如果启动类包含参数方法则会选择有参数的,否则选择无参的main方法。

九、JEP 464:范围值(第二次预览)

  • 范围值通过 JEP 429 在 JDK 20 中孵化。

  • 并通过 JEP 446 在 JDK 21 中成为预览 API。

  • 此JEP建议进行第二次预览。

本次也没作任何更改,该特性在Java 21介绍过了,这里不再赘述。

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

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

相关文章

C1.【C++ Cont】准备

目录 1.平台 2.Dev C的使用方法 1.新建项目 2.几个常用按钮 3.修改字体 3.第一个C程序:打印Hello World! 4.注 1.平台 Dev C,VS2022 2.Dev C的使用方法 1.新建项目 选择Console Application控制台应用程序,C项目 项目的后缀dev 默认下创建了一个main.cpp,cpp为c源程…

uniapp编译多端项目App、小程序,input框键盘输入后

项目场景&#xff1a; uniapp编译后的小程序端&#xff0c;app端 在一个输入框 输入消息后&#xff0c;点击键盘上的操作按钮之后键盘不被收起&#xff0c;点击其他发送按钮时&#xff0c;键盘也不被收起。 问题描述 在编译后的app上普通的事件绑定&#xff0c;tap,click在发…

pip命令行安装pytest 一直报错

其实就是切换不同镜像安装 我最终成功的是阿里云镜像 pip install --trusted-host mirrors.aliyun.com pytest 也可以用其他的 pip install -i https://pypi.org/simple pytest # 或者使用其他的镜像源 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pytest

版本管理工具切换 | svn切换到gitlab | gitblit 迁移到 gitlab

1.在能够访问SVN服务的电脑上安装 Git-2.47.0-64-bit.exe&#xff08;下载地址&#xff1a; https://github.com/git-for-windows/git/releases/download/v2.47.0.windows.1/Git-2.47.0-64-bit.exe 如果已安装其它版本可以忽略&#xff0c;但是版本必须大于Git 1.6.0&#xff…

【339】基于springboot的新能源充电系统

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;新能源充电系统的设计与实现 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解…

vue中elementUI的el-select下拉框的层级太高修改设置!

项目场景&#xff1a; 项目中遇到一个问题&#xff0c;下拉框选择之后弹出一个弹出框选择数据再关闭。 问题就出在&#xff0c;我打开下拉框后再弹出弹出框&#xff0c;弹出框的 z-index 层级没有 select 的层级高&#xff0c;导致我弹框弹出了几个下拉框还在弹出框上面显示着…

为什么 C 语言数组是从 0 开始计数的?

C 语言等大多数编程语言的数组从 0 开始而不从 1 开始&#xff0c;有两个原因&#xff1a; 第一&#xff1a;地址计算更方便 C 语言从 0 开始的话&#xff0c;array[i] 的地址就正好是&#xff1a; (array i) 如果是从 1 开始的话&#xff0c;就是 (array i - 1) 多一次计…

`map` 是 JavaScript 数组的一个高阶函数,用于对数组中的每个元素进行操作,并返回一个新的数组

文章目录 map 方法的作用语法示例 具体到你的代码完整代码片段总结 当然可以解释一下 map 方法的作用。 map 方法的作用 map 是 JavaScript 数组的一个高阶函数&#xff0c;用于对数组中的每个元素进行操作&#xff0c;并返回一个新的数组。新数组的每个元素是原数组中对应元…

代码随想录day15 二叉树(3)

文章目录 day11 栈与队列(2)栈与队列的总结 day13 二叉树&#xff08;1&#xff09;day14 二叉树&#xff08;2&#xff09;day15 二叉树&#xff08;3&#xff09; day11 栈与队列(2) 逆波兰表达式求值 https://leetcode.cn/problems/evaluate-reverse-polish-notation/ 逆…

计算机毕业设计Python+大模型股票预测系统 股票推荐系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; Python大模型股票预测系统 …

[山河CTF 2024] week3

一周不在家&#xff0c;这是补的最后一篇。后边的还有0xgame和shctf的末周。打不动了。 Crypto Approximate_n 题目分两部分&#xff0c;flag分两块两个RSA&#xff0c;第1个泄露了4个n_approxkpr的值&#xff0c;后边只泄露了1个。 第1部分利用以前的模板&#xff0c;造格…

基于SSM+VUE园艺生活植物网站JAVA|VUE|Springboot计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

C++初阶(八)--内存管理

目录 引入&#xff1a; 一、C中的内存布局 1.内存区域 2.示例变量存储位置说明 二、C语言中动态内存管理 三、C内存管理方式 1.new/delete操作内置类型 2.new和delete操作自定义类型 四、operator new与operator delete函数&#xff08;重要点进行讲解&#xff09; …

基于vue框架的的驾校预约车辆管理系统设计与实现jwoqj(程序+源码+数据库+调试部署+开发环境)系统界面在最后面

系统程序文件列表 项目功能&#xff1a;学员,教练员,驾校车辆,车辆信息,车辆类型,预约信息,时间段,教学课程,上报维修,维修内容,练车记录,取消信息 开题报告内容 基于Vue框架的驾校预约车辆管理系统设计与实现开题报告 一、研究背景与意义 随着驾驶培训行业的快速发展&…

mac ssh 连接 linux 服务器

生成 SSH 密钥对 打开终端&#xff1a; 你可以通过 Spotlight 搜索 “Terminal” 打开终端。 生成密钥对&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 手动复制公钥&#xff08;可选&#xff09; 如果 ssh-copy-id 命令不可用&#xff0…

JVM结构图

JVM&#xff08;Java虚拟机&#xff09;是Java编程语言的核心组件之一&#xff0c;负责将Java字节码翻译成机器码并执行。JVM由多个子系统组成&#xff0c;包括类加载子系统、运行时数据区、执行引擎、Java本地接口和本地方法库。 类加载子系统&#xff08;Class Loading Subsy…

IDEA 打包首个java项目为jar包

新建java项目 创建一个java项目&#xff0c;使用Maven进行项目构建&#xff0c;高级配置方面主要设置了项目包版本等信息。 依照步骤生成相关的项目。 设置maven环境 从项目设置中查找maven相关配置 设置&#xff08;settings&#xff09;-》构建、执行、部署&#xff08;B…

React面试常见题目(基础-进阶)

React面试常见题目及详细回答讲解 基础题目&#xff08;20个&#xff09; 什么是React&#xff1f; 回答&#xff1a;React是一个用于构建用户界面的JavaScript库&#xff0c;它允许你将UI拆分成可复用的组件。React起源于Facebook的内部项目&#xff0c;用于构建高性能的Web应…

同WiFi网络情况下,多个手机怎么实现不同城市的IP

在同一个WiFi网络下&#xff0c;所有设备通常都会共享同一个公网IP地址&#xff0c;因为它们连接到的是同一个路由器。要使多个手机显示为不同城市的IP地址&#xff0c;你需要使用以下方法&#xff1a; 更改网络设置 在手机的设置中&#xff0c;可以找到“无线和网络”或“网…

Spring Boot 安全 API 构建:加密解密功能的卓越实践

一、描述 在当前的数字化时代背景下&#xff0c;数据安全已成为企业绝不可忽视的关键领域。为了确保数据传输的牢固安全性&#xff0c;对API接口实施加密处理成为了必不可少的一环。本文将阐述如何在Spring Boot 3.3环境中迅速落实API加密的最佳方案&#xff0c;具体采用RSA非…