Java最新几个新JEP草案介绍


JEP草案介绍:

JEP 461:流收集器(预览)
这是 Akka 前任技术负责人 Viktor Klang 建议提出的JEP,如果修改流 API 时会发生什么?我们似乎收到了一份关于新开发方向的建议,而该方向可以说是过去十年中语言中最广泛采用的新功能。

尽管当前的 Stream API 提供了一系列全面的处理器操作(如 .map、.filter),但仍有人要求扩展其操作,如 fixedWindow(2) 或 scan((sum, next) -> sum + next)。

Akka前任技术负责人 提出的 JEP 就是在 Java 8 中为流 API 添加此类额外操作的反复请求的结果。这些请求无法满足,因为它们的应用过于特殊,无法包含在主流 API 中。

目前,人们还无法以类似于 Stream::collectinterface 允许编写收集器的方式来开发自己的处理器操作。因此,要实现某些效果有时会面临意想不到的挑战。

新的 Stream::gather 接口旨在创建自己的中间操作,可以处理各种类型的数据。Viktor 在他的著作《Gathering the streams》中对新 API 的不同用例进行了全面分类。他描述了各种类型的流操作,如间接操作、增量操作、有状态操作、无状态操作等。所有这些在前面提到的原始文档中都有详细解释。新界面被命名为 Gatherer,它的设计让人联想到著名的 Collector。

为了让你更清楚地了解,Gatherer收集器的一个例子就是折叠方法。

/** @param <T> the element type
 *  @param <A> the (mutable) intermediate accumulation type
 *  @param <R> the (probably immutable) final accumulation type
 */

interface Gatherer<T,A,R> {
    Supplier<A> initializer();
    Gatherer.Integrator<A,T,R> integrator();
    BinaryOperator<A> combiner();
    Function<A, R> finisher();
    (...)
}

Gatherer 的设计目的是提供对使用该接口创建的各个组件进行组合和重用的能力。例如,建议中演示了在标准抽象上执行流行地图的过程:

public static <T, R> Gatherer<T, ?, R> map(Function<? super T, ? extends R> mapper) {
         return Gatherer.of(
             (unused, element, downstream) -> // integrator
                 downstream.push(mapper.apply(element))
         );
     }

JEP 草案:Java 虚拟机的超前编译
可增强 JVM,使其能够加载预编译的应用程序和库。

其目标与 JVM 最近的其他一些变化保持一致,即提高应用程序的启动和执行性能。

开发人员计划分三个阶段解决目前动态执行模型产生的性能问题:

  • 预解释(第 0 层)、
  • C1 编译(第 3 层)和
  • C2 编译(第 4 层),
  •  

其中第 1 和第 2 阶段将处理 C1 编译的特定情况。理想情况下,整个过程可以通过 C2 编译器立即执行,但在现实中,这会导致优化版本的 "启动 "时间过长。

Graal 编译器就是一个恰当的例子。在 Java 17 之前,它是 C2 的可行替代品,但它的运行对应用程序产生了不利影响,因为应用程序需要经过编译才能有效运行。

此外,当 C2 编译的代码遇到不正确的优化假设时,去优化过程的代价是昂贵的,因为 C1 剖析变体必须重新编译,然后在 C2 重新编译后丢弃。

该草案在很大程度上仍在编写过程中(甚至没有完整的描述)。

JEP 462:结构化并发(第二次预览)
结构化并发功能在 JEP 428 中提出,并在 JDK 19 中作为试用 API 推出。在 JDK 20 中,该功能作为 JEP 437 在试用阶段经历了 "第二轮",由于引入了作用域值(scope value)而略有增强,并在 JDK 21 中进入了预览阶段。

另一方面,JDK 22 和 JEP 462 将不会带来任何修改,但 API 将继续处于预览阶段--社区对虚拟线程的了解还处于起步阶段,因此不宜过快地加速稳定虚拟线程的附加控制结构。


JEP 463:隐式声明类和实例主方法(第二次预览)
JEP 463 是 JEP 445 中提出的观点的修订版。其目标是让新 Java 程序员更容易编写 "hello world"。其目的是引导 Java 走向这样一条道路:初学者可以从简单的单类程序开始。他们不需要一开始就掌握为大型项目设计的复杂函数。因此,简化程序的声明应该是可行的。这将使学生在磨练技能的过程中,自然而然地掌握 Java 更复杂的方面。

不过,这次有不少修改。对最初的未命名类概念进行了重新评估。如果一个类没有明确定义,系统将为其分配一个名称,并将其作为一个普通的顶级类来运行,而不是纳入对未命名类的支持。

上一版本为被识别为此类未命名类主方法的方法引入了一套复杂的规则。现在,选择默认方法的过程简化为两步。这个过程主要考虑潜在的主方法是否有一个 String[] 参数,从而消除了因最初建议中的限制(即一个类不能同时声明具有相同名称和参数的静态方法和实例化方法)而造成的任何混淆。