服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Java SE 21 新增特性

Java SE 21 新增特性

2023-09-28 03:52未知服务器之家 Java教程

Java SE 21 新增特性 作者:Grey 原文地址: 博客园:Java SE 21 新增特性 CSDN:Java SE 21 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new_features Record Patterns 该功能首次在 Java SE 19 中预览,在Java SE 20中发布第二次预览

Java SE 21 新增特性

作者:Grey

原文地址:

博客园:Java SE 21 新增特性

CSDN:Java SE 21 新增特性

源码

源仓库: Github:java_new_features

镜像仓库: GitCode:java_new_features

Record Patterns

该功能首次在 Java SE 19 中预览,在Java SE 20中发布第二次预览版,在此版本中成为永久性功能。这意味着它可以在任何为 Java SE 21 编译的程序中使用,而无需启用预览功能。

示例代码如下

package git.snippets.jdk21;

/**
 * record 模式匹配增强
 * 无须增加 --enable-preview参数
 *
 * @author <a href="mailto:410486047@qq.com">Grey</a>
 * @date 2023/09/25
 * @since 21
 */
public class RecordTest {
    public static void main(String[] args) {
        Points points = new Points(1, 2);
        Line line = new Line(new Points(1, 2), new Points(3, 4));
        printPoints(points);
        printLine(line);
    }


    private static void printPoints(Object object) {
        if (object instanceof Points(int x, int y)) {
            System.out.println("jdk 19 object is a position, x = " + x + ", y = " + y);
        }
        if (object instanceof Points points) {
            System.out.println("pre jdk 19 object is a position, x = " + points.x()
                    + ", y = " + points.y());
        }
        switch (object) {
            case Points position -> System.out.println("pre jdk 19 object is a position, x = " + position.x()
                    + ", y = " + position.y());
            default -> throw new IllegalStateException("Unexpected value: " + object);
        }
        switch (object) {
            case Points(int x, int y) -> System.out.println(" jdk 19 object is a position, x = " + x
                    + ", y = " + y);
            default -> throw new IllegalStateException("Unexpected value: " + object);
        }

    }

    public static void printLine(Object object) {
        if (object instanceof Line(Points(int x1, int y1), Points(int x2, int y2))) {
            System.out.println("object is a path, x1 = " + x1 + ", y1 = " + y1
                    + ", x2 = " + x2 + ", y2 = " + y2);
        }
        switch (object) {
            case Line(Points(int x1, int y1), Points(int x2, int y2)) ->
                    System.out.println("object is a path, x1 = " + x1 + ", y1 = " + y1
                            + ", x2 = " + x2 + ", y2 = " + y2);
            // other cases ...
            default -> throw new IllegalStateException("Unexpected value: " + object);
        }
    }

}

record Points(int x, int y) {
}

record Line(Points from, Points to) {
}

Switch 匹配增强

该功能首次在 Java SE 17 中预览,在在此版本中成为永久性功能。这意味着它可以在任何为 Java SE 21 编译的程序中使用,而无需启用预览功能。

package git.snippets.jdk21;


/**
 * switch类型增强匹配
 * 无须增加预览参数
 *
 * @author <a href="mailto:410486047@qq.com">Grey</a>
 * @date 2023/09/25
 * @since 21
 */
public class SwitchMatchTest {
    public static void main(String[] args) {
        switchMatch(3);
        switchMatch("HELLO");
        switchMatch("hello world");
        switchMatch(null);
    }

    static void switchMatch(Object obj) {
        switch (obj) {
            case String s when s.length() > 5 -> System.out.println(s.toUpperCase());
            case String s -> System.out.println(s.toLowerCase());
            case Integer i -> System.out.println(i * i);
            case null -> System.out.println("null obj");
            default -> {
            }
        }
    }
}

String template(预览功能)

作为本版本的预览功能推出。字符串模板是对 Java 现有字符串字面量和文本块的补充,它将字面文本与嵌入式表达式和模板处理器结合起来,从而产生专门的结果。

在 Java SE 21之前,字符串的拼接可以用下述三种方式

public static void stringTestBefore21() {
        int a = 1;
        int b = 2;

        String concatenated = a + " times " + b + " = " + a * b;
        String format = String.format("%d times %d = %d", a, b, a * b);
        String formatted = "%d times %d = %d".formatted(a, b, a * b);
        System.out.println(concatenated);
        System.out.println(format);
        System.out.println(formatted);
}

Java SE 21可以用更直观的方法实现字符串的拼接

 public static void stringTest21() {
        int a = 1;
        int b = 2;


        String interpolated = STR. "\{ a } times \{ b } = \{ a * b }" ;
        System.out.println(interpolated);

        String dateMessage = STR. "Today's date: \{
                LocalDate.now().format(
                        // We could also use DateTimeFormatter.ISO_DATE
                        DateTimeFormatter.ofPattern("yyyy-MM-dd")
                ) }" ;
        System.out.println(dateMessage);


        int httpStatus = 200;
        String errorMessage = "error pwd";

        String json = STR. """
    {
      "httpStatus": \{ httpStatus },
      "errorMessage": "\{ errorMessage }"
    }""" ;
        System.out.println(json);
    }

Unnamed Patterns and Variables(预览功能)

作为预览功能引入,未命名模式匹配一个记录组件,但不声明组件的名称或类型。未命名变量是可以初始化但不使用的变量,都可以使用下划线字符 (_) 来表示它们。

例如:

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

其中 e 是未使用的变量,可以写成

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

再如

        Object object = null;
        if (object instanceof Points(int x, int y)) {
            System.out.println("object is a position, x = " + x);
        }

其中 y 是未使用的变量,可以写成

        Object object = null;
        if (object instanceof Points(int x, int _)) {
            System.out.println("object is a position, x = " + x);
        }

switch 表达式中也可以有类似的用法,例如

        Object obj = null;
        switch (obj) {
            case Byte    b -> System.out.println("Integer number");
            case Short   s -> System.out.println("Integer number");
            case Integer i -> System.out.println("Integer number");
            case Long    l -> System.out.println("Integer number");

            case Float  f -> System.out.println("Floating point number");
            case Double d -> System.out.println("Floating point number");

            default -> System.out.println("Not a number");
        }

也可以写成

Object obj = null;
        switch (obj) {
            case Byte    _ -> System.out.println("Integer number");
            case Short   _ -> System.out.println("Integer number");
            case Integer _ -> System.out.println("Integer number");
            case Long    _ -> System.out.println("Integer number");

            case Float  _ -> System.out.println("Floating point number");
            case Double _ -> System.out.println("Floating point number");

            default -> System.out.println("Not a number");
        }

Unnamed Classes and Instance Main Methods (预览功能)

预览功能,简言之,就是main方法可以更加精简,原先写一个 Hello World 需要这样做

public class UnnamedClassesAndInstanceMainMethodsTest {
    public static void main(String[] args) {
        System.out.println("hello world");
    }
}

现在可以简化成

public class UnnamedClassesAndInstanceMainMethodsTest {

    void main() {
        System.out.println("hello world");
    }

}

注:上述代码需要在命令行运行,目前IDE还不支持,在命令行下执行:

java --enable-preview --source 21 UnnamedClassesAndInstanceMainMethodsTest.java

输出:hello world

更多

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

参考资料

Java Language Changes for Java SE 21

JDK 21 Release Notes

JAVA 21 FEATURES(WITH EXAMPLES

延伸 · 阅读

精彩推荐
  • Java教程Java编程几个循环实例代码分享

    Java编程几个循环实例代码分享

    这篇文章主要介绍了Java编程几个循环实例代码分享,多看多练,小编觉得还是挺不错的,这里分享给大家,供需要的朋友参考。...

    qq_33624284的博客10692021-01-27
  • Java教程使用javafx更新UI的方法

    使用javafx更新UI的方法

    这篇文章主要介绍了使用javafx更新UI的方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...

    离离原上草7712782021-09-29
  • Java教程Spring jndi数据源配置方法详解

    Spring jndi数据源配置方法详解

    这篇文章主要为大家详细介绍了Spring jndi数据源的配置方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下解...

    蜡笔o小新6922020-12-02
  • Java教程Java实现堆排序(Heapsort)实例代码

    Java实现堆排序(Heapsort)实例代码

    这篇文章主要介绍了Java实现堆排序(Heapsort)实例代码,有需要的朋友可以参考一下 ...

    java教程网6102019-10-24
  • Java教程Java设计模式之单例模式深入探索

    Java设计模式之单例模式深入探索

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式,这种模式涉及到一...

    吾日三省贾斯汀10282022-02-15
  • Java教程浅谈从Java中的栈和堆,进而衍生到值传递

    浅谈从Java中的栈和堆,进而衍生到值传递

    这篇文章主要介绍了浅谈从Java中的栈和堆,进而衍生到值传递,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    BigData_Hubert2892020-09-17
  • Java教程Spring各版本新特性的介绍

    Spring各版本新特性的介绍

    今天小编就为大家分享一篇关于Spring各版本新特性的介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看...

    8blues11322021-07-21
  • Java教程Micronaut框架的简单使用介绍

    Micronaut框架的简单使用介绍

    这篇文章主要介绍了Micronaut框架的简单使用介绍,帮助大家更好的理解和学习使用Micronaut,感兴趣的朋友可以了解下...

    老K的java博客5942021-09-13