Java 23:新功能正式公布

最新JavaJDK23引入了VectorAPI,用于运行时编译向量计算,提供标准化API和跨架构优化。StreamGatherers从预览版正式加入,增强流API的灵活性。此外,类文件API和原始类型在模式中的使用也得到了预览,提升了开发者体验。
摘要由CSDN通过智能技术生成

最新版本的 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

  • 15
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java8到Java21的功能是持续扩展和改进的,每个版本都添加了许多特性和改进。以下是Java8到Java21的一些功能的概述: Java 8: 1. Lambda表达式:引入了函数式编程的概念,使得代码更加简洁和易读。 2. Stream API:提供了一种的操作集合的方式,使得数据处理更加高效和便捷。 3. 默认方法:允许在接口中定义具体的方法实现。 4. 时间日期API:引入了的时间日期类,提供了更好的时间日期操作和表示方式。 Java 9: 1. 模块化系统:引入了模块化的概念,使得应用程序可以更好地管理和组织依赖关系。 2. JShell:提供了一个交互式的Java编程环境,可以快速验证和测试代码片段。 3. 改进的接口私有方法:允许在接口中定义私有方法,提供了更好的代码组织和封装能力。 Java 10: 1. 局部变量类型推断:引入了var关键字,可以根据上下文推断变量的类型。 2. 并行全垃圾回收器:引入了一种的垃圾回收器,提供了更好的垃圾回收性能。 Java 11: 1. HTTP客户端:引入了一种的HTTP客户端API,使得HTTP请求和响应更加便捷。 2. Epsilon垃圾回收器:引入了一种针对性能测试的垃圾回收器,可用于在没有GC压力的情况下运行应用程序。 3. 改进的本地变量语法:允许在Lambda表达式和匿名内部类中使用var关键字。 Java 12: 1. Switch表达式:引入了一种的Switch表达式语法,使得代码更加简洁和易读。 2. Shenandoah垃圾回收器:引入了一种的低停顿时间的垃圾回收器。 Java 13: 1. 文本块:引入了一种的文本块语法,使得处理多行字符串更加方便。 2. 动态CDS归档:提供了对动态类数据共享存档的支持,可以提供更好的启动性能。 Java 14: 1. Switch表达式的改进:支持在Switch表达式中使用箭头语法和多个模式。 2. Record类:引入了一种的记录类,提供了更简洁和易读的对象表示方式。 Java 15: 1. Sealed类和接口:引入了一种的受限制的类和接口,可以限制其子类和实现类的范围。 Java 16: 1. 隐式的类型模式:引入了一种的类型推断方式,可以更简洁地声明局部变量。 Java 17: 1. 基本数据类型的行为标准化:对基本数据类型的行为进行了标准化和改进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值