JDK22 发布!

JavaGuide 官方网站javaguide.cn
JavaGuide 官方星球
JavaGuide知识星球

真快啊,国内 JDK8 还是主流,这 JDK22 都已经来了!

不同于去年发布的 JDK21,JDK22 是非长期支持版本。所以,生产项目要想体验新特性,还是建议 JDK21,那是真香啊!

JDK 22 一共有 12 个新特性:

这篇文章会挑选其中较为重要的一些新特性进行介绍。

JEP 454: 外部函数与内存 API

Java 程序可以通过该 API 与 Java 运行时之外的代码和数据进行互操作。通过高效地调用外部函数(即 JVM 之外的代码)和安全地访问外部内存(即不受 JVM 管理的内存),该 API 使 Java 程序能够调用本机库并处理本机数据,而不会像 JNI 那样危险和脆弱。

JEP 456:未命名模式和变量(预览)

未命名模式和变量使得我们可以使用下划线 _ 表示未命名的变量以及模式匹配时不使用的组件,旨在提高代码的可读性和可维护性。

未命名变量的典型场景是 try-with-resources 语句、 catch 子句中的异常变量和for循环。当变量不需要使用的时候就可以使用下划线 _代替,这样清晰标识未被使用的变量。

try (var _ = ScopedContext.acquire()) {
  // No use of acquired resource
}
try { ... }
catch (Exception _) { ... }
catch (Throwable _) { ... }

for (int i = 0, _ = runOnce(); i < arr.length; i++) {
  ...
}

未命名模式是一个无条件的模式,并不绑定任何值。未命名模式变量出现在类型模式中。

if (instanceof ColoredPoint(_, Color c){ ... c ... }

switch (b) {
    case Box(RedBall _)Box(BlueBall _) -> processBox(b);
    case Box(GreenBall _)                -> stopProcessing();
    case Box(_)                          -> pickAnotherBox();
}

JEP 459:字符串模板(第二次预览)

String Templates(字符串模板) 在 JDK21 中第一次预览,JDK22 是第二次预览。

String Templates 提供了一种更简洁、更直观的方式来动态构建字符串。通过使用占位符${},我们可以将变量的值直接嵌入到字符串中,而不需要手动处理。在运行时,Java 编译器会将这些占位符替换为实际的变量值。并且,表达式支持局部变量、静态/非静态字段甚至方法、计算结果等特性。

实际上,String Templates(字符串模板)再大多数编程语言中都存在:

"Greetings {{ name }}!";  //Angular
`Greetings ${ name }!`;    //Typescript
$"Greetings { name }!"    //Visual basic
f"Greetings { name }!"    //Python

Java 在没有 String Templates 之前,我们通常使用字符串拼接或格式化方法来构建字符串:

//concatenation
message = "Greetings " + name + "!";

//String.format()
message = String.format("Greetings %s!", name);  //concatenation

//MessageFormat
message = new MessageFormat("Greetings {0}!").format(name);

//StringBuilder
message = new StringBuilder().append("Greetings ").append(name).append("!").toString();

这些方法或多或少都存在一些缺点,比如难以阅读、冗长、复杂。

Java 使用 String Templates 进行字符串拼接,可以直接在字符串中嵌入表达式,而无需进行额外的处理:

String message = STR."Greetings \{name}!";

在上面的模板表达式中:

  • STR 是模板处理器。
  • \{name}为表达式,运行时,这些表达式将被相应的变量值替换。

Java 目前支持三种模板处理器:

  • STR:自动执行字符串插值,即将模板中的每个嵌入式表达式替换为其值(转换为字符串)。
  • FMT:和 STR 类似,但是它还可以接受格式说明符,这些格式说明符出现在嵌入式表达式的左边,用来控制输出的样式
  • RAW:不会像 STR 和 FMT 模板处理器那样自动处理字符串模板,而是返回一个 StringTemplate 对象,这个对象包含了模板中的文本和表达式的信息
String name = "Lokesh";

//STR
String message = STR."Greetings \{name}.";

//FMT
String message = STR."Greetings %-12s\{name}.";

//RAW
StringTemplate st = RAW."Greetings \{name}.";
String message = STR.process(st);

除了 JDK 自带的三种模板处理器外,你还可以实现 StringTemplate.Processor 接口来创建自己的模板处理器。

我们可以使用局部变量、静态/非静态字段甚至方法作为嵌入表达式:

//variable
message = STR."Greetings \{name}!";

//method
message = STR."Greetings \{getName()}!";

//field
message = STR."Greetings \{this.name}!";

还可以在表达式中执行计算并打印结果:

int x = 10, y = 20;
String s = STR."\{x} + \{y} = \{x + y}";  //"10 + 20 = 30"

为了提高可读性,我们可以将嵌入的表达式分成多行:

String time = STR."The current time is \{
    //sample comment - current time in HH:mm:ss
    DateTimeFormatter
      .ofPattern("
HH:mm:ss")
      .format(LocalTime.now())
  }."
;

JEP 460:向量 API(第七次孵化)

向量计算由对向量的一系列操作组成。向量 API 用来表达向量计算,该计算可以在运行时可靠地编译为支持的 CPU 架构上的最佳向量指令,从而实现优于等效标量计算的性能。

向量 API 的目标是为用户提供简洁易用且与平台无关的表达范围广泛的向量计算。

这是对数组元素的简单标量计算:

void scalarComputation(float[] a, float[] b, float[] c) {
   for (int i = 0; i < a.length; i++) {
        c[i] = (a[i] * a[i] + b[i] * b[i]) * -1.0f;
   }
}

这是使用 Vector 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;
    }
}

JEP 461:流收集器(预览)

这个改进使得 Stream API 可以支持自定义中间操作。

source.gather(a).gather(b).gather(c).collect(...)

👉推荐

    点击下方布局进入公众号

    回复「PDF 即可获取原创PDF技术面试手册
    回复「学习路线即可获取4w+字最新版Java学习路线回复「开源即可获取优质Java开源项目合集免费分享无套路,有帮助点赞就好! 
     


    相关推荐

  • 端到端加速企业GenAI创新,英伟达NIM微服务成为软件企业看中的亮点!
  • 巨头争锋:AGI来到临界点?
  • 突发!Stability AI核心团队已分崩离析,抢功、侵权、撤资争议不断,AI界有自己的“春山学”
  • 使用 BigDL-LLM 加速 Intel * 数据中心 GPU 上的 LLM 推理
  • 裁员潮持续,劝所有程序员早点做个人规划!| 极客时间
  • Sora很难跟进?微调就不是一个岗位?大力出奇迹将继续适用?大模型将对软件生态带来哪些变化?
  • 没有App,也没有 App Store,未来的手机会干掉全部应用开发人员吗?
  • 杭州/深圳内推 | VIVO影像算法研究部招聘AIGC+计算摄影方向算法工程师/实习生
  • 港科大(广州)开源智慧交通新成果,用AI大模型控制红绿灯
  • 能否在追问中坚持判断?揭秘大语言模型的判断一致性挑战
  • 最新爆料!GPT-5已有客户上手体验:性能惊人,或将在夏天发布
  • Transformer七子重聚GTC,老黄亲自赠送签名版DGX-1!7年奠基之作背后佚事揭秘
  • 瘫痪8年小哥植入马斯克脑机接口,狂打8小时「文明6」!Neuralink首个人类植入者直播来了
  • 中国AI开发者「抢人战」倒计时2天!IEEE首位中国籍副主席、OpenAI大佬齐聚,2024 GDC大会来了
  • Zilliz联手英伟达发布全球首个GPU加速向量数据库!CUDA加持性能飙升50倍,未来十年或暴涨1000倍
  • qiankun?这次我选了wujie!
  • CVPR 2024 | 一统所有目标感知任务,华科&字节提出目标感知基础模型GLEE
  • CMU朱俊彦、Adobe新作:512x512图像推理,A100只用0.11秒
  • 薪酬、人数上不封顶,这家互联网大厂正在疯抢超级毕业生
  • 72岁法国概率论大佬获阿贝尔奖,陶哲轩:他的知名度理应更高