Java SE 22 新增特性

Java SE 22 新增特性

作者:Grey

原文地址:

博客园:Java SE 22 新增特性

CSDN:Java SE 22 新增特性

源码

源仓库: Github:java_new_features

使用未命名的变量和模式

我们经常需要定义一些我们根本不需要的变量。常见的例子包括异常、lambda表达式,例如:

try {String string = "xx";int number = Integer.parseInt(string);
} catch (NumberFormatException e) {System.err.println("Not a number");
}

如果异常变量 e 无须使用,那么上述例子中的变量 e 可以用 _ 代替

try {String string = "xx";int number = Integer.parseInt(string);
} catch (NumberFormatException _) {System.err.println("Not a number");
}

这个功能在 Java SE 21 中作为预览功能发布,详见Java SE 21 新增特性,在 Java 22 中通过 JEP 456 最终确定,不会有任何更改。

启动多文件源代码程序

自 Java 11 起,我们可以直接执行仅由一个文件组成的 Java 程序,而无需先对其进行编译,详见Java SE 11 新增特性

例如,在 Hello.java 文件中保存一次以下 Java 代码:

public class Hello {public static void main(String[] args) {System.out.printf("Hello %s!%n", args[0])}
}

不需要 javac 编译这个程序,而是可以直接运行它:

java Hello.java

我们也可以在 Hello.java 文件中定义多个类。但是,随着程序的增长,这种做法很快就会变得混乱;其他类应该定义在单独的文件中,并以合理的包结构组织起来。

然而,一旦我们添加更多的 Java 文件,Java 11 中所谓的 "启动单个文件源代码 "机制就不再起作用了。

比如定义两个类:

public class Hello {public static void main(String[] args) {System.out.println(Greetings.greet(args[0]));}
}
public class Greetings {public static String greet(String name) {return "Hello %s!%n".formatted(name);}
}

在 Java SE 11 中,无法执行,因为只支持单个 Java 文件运行,但是到了 Java SE 22,可以支持多个文件源码运行,比如上述两个类,在 Java SE 22 下,可以通过

java Hello.java

运行。

Foreign Function 和 Memory API

在Project Panama中,取代繁琐、易出错、速度慢的 Java 本地接口(JNI)的工作已经进行了很长时间。

在 Java 14 和 Java 16 中已经引入了 "外来内存访问 API "和 “外来链接器 API”–最初都是单独处于孵化阶段。在 Java 17 中,这些 API 被合并为 “Foreign Function & Memory API”(FFM API),直到 Java 18,它一直处于孵化阶段。

在 Java 19 中,JDK Enhancement Proposal 424最终将新的 API 提升到了预览阶段,

在 Java SE 22 中,外来函数与内存 API 终于由 JDK Enhancement Proposal 454 最终确定。

FFM API 可以直接从 Java 访问本地内存(即 Java 堆外的内存)和访问本地代码(如 C 库)。

下面是一个简单的例子,它在堆外内存中存储一个字符串,并对其调用 C 语言标准库的 "strlen "函数。

package git.snippets.jdk22;import java.lang.foreign.*;
import java.lang.invoke.MethodHandle;/*** FFM API* @since 22*/
public class FFMTest {public static void main(String[] args) throws Throwable {// 1. Get a lookup object for commonly used librariesSymbolLookup stdlib = Linker.nativeLinker().defaultLookup();// 2. Get a handle to the "strlen" function in the C standard libraryMethodHandle strlen = Linker.nativeLinker().downcallHandle(stdlib.find("strlen").orElseThrow(), FunctionDescriptor.of(ValueLayout.JAVA_LONG, ValueLayout.ADDRESS));// 3. Get a confined memory area (one that we can close explicitly)try (Arena offHeap = Arena.ofConfined()) {// 4. Convert the Java String to a C string and store it in off-heap memoryMemorySegment str = offHeap.allocateFrom("Happy Coding!");// 5. Invoke the foreign functionlong len = (long) strlen.invoke(str);System.out.println("len = " + len);}// 6. Off-heap memory is deallocated at end of try-with-resources}
}

本地化列表

Java SE 22 有了新的 ListFormat 类,我们就可以像在连续文本中一样,将列表格式化为枚举。

package git.snippets.jdk22;import static java.text.ListFormat.*;import java.text.ListFormat;
import java.util.List;
import java.util.Locale;public class LocaleDependentListPatternsTest {void main() {List<String> list = List.of("Earth", "Wind", "Fire");System.out.println(ListFormat.getInstance(Locale.CHINA, Type.STANDARD, Style.FULL).format(list));System.out.println(ListFormat.getInstance(Locale.US, Type.STANDARD, Style.FULL).format(list));System.out.println(ListFormat.getInstance(Locale.GERMAN, Type.STANDARD, Style.FULL).format(list));System.out.println(ListFormat.getInstance(Locale.FRANCE, Type.STANDARD, Style.FULL).format(list));}
}

运行输出结果

EarthWindFire
Earth, Wind, and Fire
Earth, Wind und Fire
Earth, Wind et Fire

上述例子表明在不同的 Lacale 设置下,可自动根据配置进行格式化。

更多

Java SE 7及以后各版本新增特性,持续更新中…

参考资料

Java Language Changes for Java SE 22

JDK 22 Release Notes

JAVA 22 FEATURES(WITH EXAMPLES

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

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

相关文章

【Linux】基础 IO(动静态库)-- 详解

一、前言 为什么要使用别人的代码&#xff1f; 主要是为了提高程序开发的效率和程序的健壮性。 当别人把功能都实现了&#xff0c;然后我们再基于别人的代码去做二次开发&#xff0c;那么效率当然就提高了。其次&#xff0c;这里基于的别人当然不是随便找的一个人&#xff0c;…

[Qt学习笔记]Qt鼠标事件mouseMoveEvent实时获取图像的坐标和像素值

目录 1、介绍2、效果展示3、实现过程3.1 图像的加载和显示3.2 设置鼠标跟踪事件激活3.3 实现代码 4、源码展示 1、介绍 上一篇介绍了使用OpenCV的setMouseCallback回调函数实现获取鼠标点击点的图像坐标和像素值&#xff0c;本篇使用鼠标事件mouseMoveEvent函数来实现实时获取…

OPPO 后端二面,凉凉。。。

美众议院通过 TikTok 法案 之前我们讲了 老美要求字节跳动在 165 天内剥离短视频应用 TikTok&#xff0c;当时的最新进度是 TikTok 给 1.7 亿美国用户发弹窗&#xff0c;发动用户群众给国会打电话进行抗议。 但显然这点力度的抗议并不会造成什么实质影响。 昨晚&#xff0c;美国…

精读《useRef 与 createRef 的区别》

1 引言 useRef 是常用的 API&#xff0c;但还有一个 createRef 的 API&#xff0c;你知道他们的区别吗&#xff1f;通过 React.useRef and React.createRef: The Difference 这篇文章&#xff0c;你可以了解到何时该使用它们。 2 概述 其实原文就阐述了这样一个事实&#xf…

【EDSR】《Enhanced Deep Residual Networks for Single Image Super-Resolution》

CVPR workshops-2017 首尔大学 code&#xff1a; https://github.com/limbee/NTIRE2017/tree/masterhttps://github.com/sanghyun-son/EDSR-PyTorch 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method4.1 Residual blocks4.2 Single…

华为OD机试 - 单向链表中间节点(Java JS Python C C++)

题目描述 给定一个单链表 L&#xff0c;请编写程序输出 L 中间结点保存的数据。 如果有两个中间结点&#xff0c;则输出第二个中间结点保存的数据。例如&#xff1a; 给定 L 为 1→7→5&#xff0c;则输出应该为7&#xff1b; 给定 L 为 1→2→3→4&#xff0c;则输出应该为…

盘点国内IP地址服务的功能及提供商

随着互联网的快速发展和普及&#xff0c;IP地址服务提供商在中国市场扮演着越来越重要的角色。这些代理软件提供商不仅为用户提供稳定的网络连接&#xff0c;还可以帮助用户实现IP地址切换、绕过地理限制等功能。虎观代理接下来将详解国内IP地址服务的主要功能&#xff0c;并对…

王道c语言-chap13 栈实例

王道c语言-chap13 栈实例 #include <iostream>#define END -1 #define MaxSize 50typedef int ElemType; typedef struct {int data[MaxSize];int top; } SqStack;void InitStack(SqStack &s) {s.top-1; }void PrinfSqStack(SqStack s) {for (int i 0; i < s.to…

什么是布隆过滤器

布隆过滤器&#xff08;Bloom Filter&#xff09;是一种概率型数据结构&#xff0c;用于判断一个元素是否存在于一个集合中。它的主要优点是占用空间少、查询速度快&#xff0c;并且支持高效的插入和查询操作。 布隆过滤器由一个位数组和多个哈希函数构成。初始时&#xff0c;…

八股文三(Spring、Spring Cloud Alibaba)

Spring篇 什么是Spring Spring是个轻量级的框架&#xff0c;他有两大内核分别是IOC、AOPIOC是什么 * 依赖注入和控制反转&#xff0c;它是一种思想&#xff0c;创建对象不是直接new出来&#xff0c;而是交给IOC容器&#xff0c;由容器去创建进行管理&#xff0c;这就是控制反…

解决antd vue 的table列表过宅内容换行和过长有空白列的问题

主要有两个注意点 1、columns数组中保留一个对象不设置宽度&#xff0c;其余都要设置宽度&#xff1b; 2、HTML中scroll要设置为{x: 足够长的固定宽度}&#xff1b; 具体代码如下&#xff1a; <a-tableref"table"size"middle"rowKey"rowSerial&qu…

字符串函数---(1)

字符函数 文章目录 前言1.strlen 的使用和模拟实现2.strcpy 的使用和模拟实现3. strcat 的使用和模拟实现4. strcmp 的使用和模拟实现 前言 上一篇我们学习了字符函数&#xff0c;下来我们学习常见的字符串函数 1.strlen 的使用和模拟实现 size_t strlen(const char *str) 字…

(70min)字节暑假实习二面(已挂)

还没找到工作的小伙伴加油&#xff01; 字节看面评果然名不虚传。。 面试官&#xff1a; 看你一面基础也回答得不好&#xff0c;没事&#xff0c;那我就不问你八股&#xff0c;多问项目吧。 然后开始鞭打项目。 项目使用mq&#xff0c;从背景的&#xff0c;技术选型&#xff0…

DDOS攻击防御介绍

DDOS&#xff1a;分布式拒绝服务攻击 瞬间收到大量数据 总带宽是有限的 合法用户访问的时候&#xff0c;被非法方法流量占据 无法溯源 流量清洗&#xff1a;AntiDdos 边界&#xff0c;旁挂的 备用域名&#xff0c;ip更换 机房会提供解决方案 解决不了问题&#xff0c;就干…

【真实体会】花几百块买ChatGPT4.0账号一年值得吗?

GPT4.0使用体验及价值 性能提升: GPT4比GPT3.5在内容质量和数量上有显著提高&#xff0c;使得知乎等平台的收益增加。 功能丰富: GPT4支持文本、图片、文件问答&#xff0c;而GPT3.5仅支持文本。GPT4内置多种专业工具&#xff08;GPTS&#xff09;&#xff0c;如设计师LOGO的A…

关于我的经历

技能 1 Java基础扎实&#xff0c;具备并发编程经验&#xff0c;熟悉JMM、线程通信线程安全、锁、原子类、阻塞队列、并发容器、线程池原理。清楚并发内容的实现原理。阅读过部分JDK源码。 深入了解JVM虚拟机&#xff1a;内存模型、GC、垃圾回收算法、以及垃圾回收器&#xff0…

Android Studio实现内容丰富的安卓视频管理平台

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 项目编号081 1. 开发环境 android stuido 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.本地视频 3.视频播放 4.收藏功能 5.网路视频 6.个人中心 7.我的收藏 8.浏览历史 3.系…

蓝桥杯第14届模拟赛最大连通分块(dfs)

问题描述(答案148)   小蓝有一个 30 行 60 列的数字矩阵&#xff0c;矩阵中的每个数都是 0 或 1 。 110010000011111110101001001001101010111011011011101001111110 010000000001010001101100000010010110001111100010101100011110 001011101000100011111111111010000010010…

Redis高阶使用消息队列分布式锁排行榜等

一、前言 在大多数传统的web系统中&#xff0c;使用Redis一般都是作为缓存使用&#xff0c;在大数据查询时作为缓解性能的一种解决方案。博主的的系统中使用Redis也主要使用到缓存的作用&#xff0c;还有做了注册中心&#xff0c;分布式事务。其他的强大的功能&#xff0c;没有…

【哈希表】算法例题

目录 五、哈希表 39. 赎金信 ① 40. 同构字符串 ① 41. 单词规律 ① 42. 有效的字母异位词 ① 43. 字母异位词分组 ② 44. 两数之和 ① 45. 快乐数 ① 46. 存在重复元素 ① 47. 最长连续序列 ② 五、哈希表 39. 赎金信 ① 给你两个字符串&#xff1a;ransomNote 和 m…