最新版本的 Java 开发工具包 23 (JDK) 在最新版本中具有四个新功能。到目前为止值得注意的两个主要功能是 Vector API、Stream Gatherers 的第二个预览以及模式中原始类型的预览 - 例如instanceof和switch。

友情提醒,最新版本将于 9 月 19 日发布。

Vector API
自Java Development Kit 16发布以来, Vector API一直在Java的早期版本中孵化,一直到最新版本22。
这个新版本将引入一个API来帮助表达在运行时编译的向量计算。

  • 是为了在不同支持的 CPU 架构上拥有最佳的向量指令。
  • 该提案的一些目标包括提供标准化 API、运行时编译、在x64和AArch64CPU 架构上提供更好的性能、优雅降级、与平台无关以及与 Valhalla 项目保持更多一致
  • 该项目旨在增强 Java 对象模型的值对象而是对象。

矢量 API 代码示例


static final VectorSpecies<Float> SPECIES = FloatVector.SPECIES_PREFERRED;

void vectorComputation(float[] a, float[] b, float[] c) {
    int i = 0;
    int upperBound = SPECIES.loopBound(a.length);
    for (; i < upperBound; i += SPECIES.length()) {
        // FloatVector va, vb, vc;
        var va = FloatVector.fromArray(SPECIES, a, i);
        var vb = FloatVector.fromArray(SPECIES, b, i);
        var vc = va.mul(va)
                   .add(vb.mul(vb))
                   .neg();
        vc.intoArray(c, i);
    }
    for (; i < a.length; i++) {
        c[i] = (a[i] * a[i] + b[i] * b[i]) * -1.0f;
    }
}

流收集器和流 API
如果您还记得,流收集器Stream Gatherers是 Java Development Kid 22 版本中预览的一部分。现在它将完全添加到 JDK 23 中。

  • Stream Gatherers 将增强Stream API以支持自定义操作。
  • 它们还允许流管道以当前内置操作难以实现的方式帮助转换数据。
  • 这样做的目标是使流管道更加灵活和富有表现力——这也将允许自定义操作来操纵无限大小的流。

使用 类文件 API 的目的是提供一个用于处理类文件的 API:

  • 该 API 跟踪 Java 虚拟机规范定义的类文件格式。
  • 这也意味着它将使 JDK 组件能够迁移到标准 API,并删除 Java 开发工具包的ASM 库副本。

类文件 API 添加了一些微调 :

  • 包括简化类 CodeBuilder ,
  • 默认情况下包含字节码指令的工厂方法,包括低级工厂、中级工厂和基本块的高级构建器。

下面是 ASM CodeBuilder 与 Java CodeBuilder 的一些示例代码。

ASM CodeBuilder 代码示例


ClassWriter classWriter = ...;  
MethodVisitor mv = classWriter.visitMethod(0, "fooBar", "(ZI)V", **null**, **null**);  
mv.visitCode();  
mv.visitVarInsn(ILOAD, 1);  
Label label1 = **new** Label();  
mv.visitJumpInsn(IFEQ, label1);  
mv.visitVarInsn(ALOAD, 0);  
mv.visitVarInsn(ILOAD, 2);  
mv.visitMethodInsn(INVOKEVIRTUAL, "Foo", "foo", "(I)V", false);  
Label label2 = **new** Label();  
mv.visitJumpInsn(GOTO, label2);  
mv.visitLabel(label1);  
mv.visitVarInsn(ALOAD, 0);  
mv.visitVarInsn(ILOAD, 2);  
mv.visitMethodInsn(INVOKEVIRTUAL, "Foo", "bar", "(I)V", false);  
mv.visitLabel(label2);  
mv.visitInsn(RETURN);  
mv.visitEnd();  

Java CodeBuilder 示例代码


ClassBuilder classBuilder = ...;  
classBuilder.withMethod("fooBar", MethodTypeDesc.of(CD\_**void**, CD\_**boolean**, CD\_**int**), flags,  
                        methodBuilder -> methodBuilder.withCode(codeBuilder -> {  
    Label label1 = codeBuilder.newLabel();  
    Label label2 = codeBuilder.newLabel();  
    codeBuilder.iload(1)  
        .ifeq(label1)  
        .aload(0)  
        .iload(2)  
        .invokevirtual(ClassDesc.of("Foo"), "foo", MethodTypeDesc.of(CD\_**void**, CD\_**int**))  
        .**goto**\_(label2)  
        .labelBinding(label1)  
        .aload(0)  
        .iload(2)  
        .invokevirtual(ClassDesc.of("Foo"), "bar", MethodTypeDesc.of(CD\_**void**, CD\_**int**))  
        .labelBinding(label2);  
        .**return**\_();  
});  

在 Java Development Kit 23 中,

  1. Java CodeBuilder 删除了与低级方法重复的中级方法,或者更糟糕的是,不经常使用的中级方法。

  2. 同时您重命名其余的中级方法以提高可用性。

  3. 他们还完善了 ClassSignature 班级模型。这意味着它已得到改进,可以更准确地对superclasses和的通用签名进行建模superinterfaces。

根据此功能背后的 OpenJDK 提案,Java 平台应该定义和实现一个标准的类文件 API,该 API 与类文件格式一起发展,该格式可以轻松地更改或发展大约每六个月一次。

模式中的原始类型
正如前面提到的,随着 Java Development Kit 23 的最新计划功能和版本的发布,我们获得了另一个对于 Java 开发人员来说非常值得注意的预览功能: primitive types in patterns, instanceof,  switch

此功能将通过允许:

  • 模式上下文中的原始类型模式来显着增强模式匹配。
  • 然后我们扩展instanceof 和 switch 来处理所有原始类型。
  • 这还包括在嵌套和顶级上下文中使用原始类型模式的模式匹配: 提供易于使用的构造,消除由于不安全的强制转换而丢失信息的风险
  • 其他目标包括将模式类型与 对齐 instanceof、 instanceof 与安全转换对齐以及
  • 允许 switch 处理任何原始类型的值。

原始类型Primitive Type代码案例:

https://www.jdon.com/73344.html

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐