JAVA 22:有什么新特性?
内容提要
Java 22引入了多个新功能,包括Stream Gatherer API,允许开发人员为Stream API定义自己的中间操作。其他功能包括无需预先编译即可从源文件启动程序,调用超类构造函数之前执行指令的能力,以及用于解析和生成Java类文件的Class-File API。此外,G1垃圾收集器有所改进,Java Flight Recorder中还有新的事件。总体而言,Java 22旨在简化语言并使其更加用户友好。
延伸解读
Stream Gatherer:突破中间操作的限制
Java 22 的 Stream Gatherer(预览)允许开发者自定义流的中间操作,弥补了 Stream API 只能扩展终端操作的不足。通过 Stream::gather(Gatherer) 方法,可以实现一对一、一对多、多对一或多对多的转换,并支持有状态操作和短路。内置的 Gatherers 工具类提供了 fold、mapConcurrent、scan、windowFixed 和 windowSliding 等常用收集器,方便实现滑动窗口、并发映射等场景。该特性仍为预览,需通过 --enable-previ
简化开发:多文件源码启动与 super 前语句
JEP 458 扩展了 Java 11 的源码启动功能,现在可以从多个源文件直接启动程序,启动器会自动在内存中编译主程序及其依赖的源文件,无需预先编译。JEP 447(预览)允许在调用父类构造函数之前执行不访问实例的语句,例如参数验证,使代码更可读并可能避免不必要的父类构造开销。这两个特性都旨在降低学习曲线和简化小型程序及原型开发。
Class-File API 与 ListFormat:标准化与本地化
JEP 457 引入了用于解析、生成和转换 Java 类文件的标准 API(预览),旨在解决第三方字节码库(如 ASM)需要跟随 Java 版本更新的问题,并消除 JDK 内部工具与语言特性之间的版本差异。ListFormat 是一个新的格式化工具,可根据 Unicode 标准本地化地格式化字符串列表,支持指定语言、类型(STANDARD、OR、UNIT)和样式(FULL、SHORT、NARROW),方便生成符合区域习惯的列表文本。
正式转正与持续预览:API 状态变化
Java 22 中,外部函数与内存 API(JEP 454)和未命名变量与模式(JEP 456)已从预览转为标准。前者用于替代 JNI 进行本地代码互操作,并引入了受限方法概念,需通过 --enable-native-access 选项启用;后者允许使用下划线表示未使用的变量或模式。同时,仍有多个特性处于预览或孵化阶段,如向量 API(第七次孵化)、作用域值、结构化并发、隐式声明类与实例 main 方法、字符串模板(均为第二次预览),这些特性尚未定型,需谨慎用于生产环境。
Q&A
Java 22 中 Stream Gatherer API 有什么作用?
Stream Gatherer API(JEP 461)允许开发人员通过 Stream::gather(Gatherer) 定义自定义的中间操作,从而增强 Stream API。Gatherer 可以将流中的元素转换为一对一、一对多、多对一或多对多,并可在必要时停止转换。它提供了 initializer、integrator、combiner、finisher 等方法,并内置了 fold、mapConcurrent、scan、windowFixed、windowSliding 等收集器。
如何在 Java 22 中从多个源文件启动程序?
Java 22 引入了 JEP 458,允许从使用另一个源文件中定义的类的源文件启动程序,而无需预先编译。Java 启动器会自动在内存中编译所需的源文件,并且只编译主程序实际使用的源文件。源文件按照包结构在通常的 Java 目录层次中搜索。
Java 22 允许在调用 super() 之前执行语句吗?
是的,JEP 447(预览)允许在调用父类构造函数之前执行指令,前提是这些指令不访问正在创建的实例。这可以提高代码可读性,并可能避免不必要的父构造函数工作。例如,可以在调用 super() 之前进行参数验证。
Java 22 的 Class-File API 是什么?
JEP 457 提供了用于解析、生成和转换 Java 类文件的标准 API(预览)。它旨在解决现有字节码生成框架(如 ASM)需要跟随 Java 版本更新的问题,通过在 JDK 中直接提供 API 来克服版本差异。
Java 22 中哪些预览功能成为了标准?
Java 22 中,JEP 454(外来函数与内存 API)和 JEP 456(未命名变量和模式)已从预览版转为标准功能。其中,外来函数与内存 API 引入了受限方法的概念,需要使用 --enable-native-access 命令行选项才能访问。
Java 22 的 G1 垃圾收集器有哪些改进?
JEP 423 改进了 G1 垃圾收集器,使其能够在 JNI 关键部分发生时仅固定单个区域,而不是完全禁用 G1。这避免了阻塞需要 GC 的应用程序线程,降低了内存不足的风险。
Java 22 中 Java Flight Recorder 新增了哪些事件?
Java 22 的 JFR 新增了以下事件:CompilerQueueUtilization(编译器队列利用率)、NativeLibraryLoad(本机库加载)、NativeLibraryUnload(本机库卸载)和 DeprecatedInvocation(对已弃用方法的调用)。