Java SE 22 新增特性

Java SE 22 新增特性

作者:Grey

原文地址:

博客园:Java SE 22 新增特性

CSDN:Java SE 22 新增特性

源码

源仓库: Github:java_new_features

使用未命名的变量和模式

我们经常需要定义一些我们根本不需要的变量。常见的例子包括异常、lambda表达式,例如:

try {
    String string = "xx";
    int number = Integer.parseInt(string);
} catch (NumberFormatException e) {
    System.err.println("Not a number");
}

如果异常变量 e 无须使用,那么上述例子中的变量 e 可以用 _ 代替

try {
    String string = "xx";
    int number = Integer.parseInt(string);
} catch (NumberFormatException _) {
    System.err.println("Not a number");
}

这个功能在 Java SE 21 中作为预览功能发布,详见Java SE 21 新增特性,在 Java 22 中通过 JEP 456 最终确定,不会有任何更改。

启动多文件源代码程序

自 Java 11 起,我们可以直接执行仅由一个文件组成的 Java 程序,而无需先对其进行编译,详见Java SE 11 新增特性

例如,在 Hello.java 文件中保存一次以下 Java 代码:

public class Hello {
  public static void main(String[] args) {
    System.out.printf("Hello %s!%n", args[0])}
}

不需要 javac 编译这个程序,而是可以直接运行它:

java Hello.java

我们也可以在 Hello.java 文件中定义多个类。但是,随着程序的增长,这种做法很快就会变得混乱;其他类应该定义在单独的文件中,并以合理的包结构组织起来。

然而,一旦我们添加更多的 Java 文件,Java 11 中所谓的 "启动单个文件源代码 "机制就不再起作用了。

比如定义两个类:

public class Hello {
  public static void main(String[] args) {
    System.out.println(Greetings.greet(args[0]));
  }
}
public class Greetings {
  public static String greet(String name) {
    return "Hello %s!%n".formatted(name);
  }
}

在 Java SE 11 中,无法执行,因为只支持单个 Java 文件运行,但是到了 Java SE 22,可以支持多个文件源码运行,比如上述两个类,在 Java SE 22 下,可以通过

java Hello.java

运行。

Foreign Function 和 Memory API

Project Panama中,取代繁琐、易出错、速度慢的 Java 本地接口(JNI)的工作已经进行了很长时间。

在 Java 14 和 Java 16 中已经引入了 "外来内存访问 API "和 “外来链接器 API”–最初都是单独处于孵化阶段。在 Java 17 中,这些 API 被合并为 “Foreign Function & Memory API”(FFM API),直到 Java 18,它一直处于孵化阶段。

在 Java 19 中,JDK Enhancement Proposal 424最终将新的 API 提升到了预览阶段,

在 Java SE 22 中,外来函数与内存 API 终于由 JDK Enhancement Proposal 454 最终确定。

FFM API 可以直接从 Java 访问本地内存(即 Java 堆外的内存)和访问本地代码(如 C 库)。

下面是一个简单的例子,它在堆外内存中存储一个字符串,并对其调用 C 语言标准库的 "strlen "函数。

package git.snippets.jdk22;

import java.lang.foreign.*;
import java.lang.invoke.MethodHandle;


/**
 * FFM API
 * @since 22
 */
public class FFMTest {
    public static void main(String[] args) throws Throwable {
        // 1. Get a lookup object for commonly used libraries
        SymbolLookup stdlib = Linker.nativeLinker().defaultLookup();
        // 2. Get a handle to the "strlen" function in the C standard library
        MethodHandle strlen = Linker.nativeLinker().downcallHandle(stdlib.find("strlen").orElseThrow(), FunctionDescriptor.of(ValueLayout.JAVA_LONG, ValueLayout.ADDRESS));

        // 3. Get a confined memory area (one that we can close explicitly)
        try (Arena offHeap = Arena.ofConfined()) {

            // 4. Convert the Java String to a C string and store it in off-heap memory
            MemorySegment str = offHeap.allocateFrom("Happy Coding!");

            // 5. Invoke the foreign function
            long len = (long) strlen.invoke(str);
            System.out.println("len = " + len);
        }
        // 6. Off-heap memory is deallocated at end of try-with-resources
    }
}

本地化列表

Java SE 22 有了新的 ListFormat 类,我们就可以像在连续文本中一样,将列表格式化为枚举。

package git.snippets.jdk22;

import static java.text.ListFormat.*;

import java.text.ListFormat;
import java.util.List;
import java.util.Locale;

public class LocaleDependentListPatternsTest {
    void main() {
        List<String> list = List.of("Earth", "Wind", "Fire");
        System.out.println(ListFormat.getInstance(Locale.CHINA, Type.STANDARD, Style.FULL).format(list));
        System.out.println(ListFormat.getInstance(Locale.US, Type.STANDARD, Style.FULL).format(list));
        System.out.println(ListFormat.getInstance(Locale.GERMAN, Type.STANDARD, Style.FULL).format(list));
        System.out.println(ListFormat.getInstance(Locale.FRANCE, Type.STANDARD, Style.FULL).format(list));
    }
}

运行输出结果

EarthWindFire
Earth, Wind, and Fire
Earth, Wind und Fire
Earth, Wind et Fire

上述例子表明在不同的 Lacale 设置下,可自动根据配置进行格式化。

更多

Java SE 7及以后各版本新增特性,持续更新中…

参考资料

Java Language Changes for Java SE 22

JDK 22 Release Notes

JAVA 22 FEATURES(WITH EXAMPLES

  • 21
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GreyZeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值