首页 > 编程语言 >Java SE 20 新增特性

Java SE 20 新增特性

时间:2023-05-03 20:11:46浏览次数:53  
标签:Java int object System 20 SE

Java SE 20 新增特性

作者:Grey

原文地址:

博客园:Java SE 20 新增特性

CSDN:Java SE 20 新增特性

源码

源仓库: Github:java_new_features

镜像仓库: GitCode:java_new_features

Switch类型匹配(第四次预览)

Java SE 17 新增特性中,Switch 类型匹配作为预览功能推出,到 Java SE 20 ,这个功能已经是第四次预览版,在 Java SE 17 中,可以通过加强 switch 表达式和语句的模式匹配能力,减少了定义这些表达式所需的模板,此外,switch 中增加了空值的支持。如下示例:

注:执行如下代码需要基于 Java SE 17 + ,且增加--enable-preview参数。

package git.snippets.jdk20;


/**
 * switch类型匹配(二次预览)
 *
 * @author <a href="mailto:[email protected]">Grey</a>
 * @date 2023/05/03
 * @since 20
 */
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 -> {
            }
        }
    }
}

范围值(Scoped Value,孵化阶段)

JEP 429 在 Java SE 20 的孵化阶段引入了范围值(ScopedValue), 范围值可以与虚拟线程很好地结合。它允许在有限的时间内存储一个值,而且只有写入该值的线程可以读取它。类似ThreadLocal对于线程的作用。详见:SCOPED VALUES IN JAVA

record 的匹配增强(第二次预览)

record 的匹配增强首次预览在 Java SE 19, record 可以与 instanceof 一起使用,也可以使用 switch 来访问记录的字段,而无需强制转换和调用访问器方法,一个 record 的示例如下

package git.snippets.jdk20;

/**
 * record 模式匹配增强(二次预览)
 * 需要增加 --enable-preview参数
 *
 * @author <a href="mailto:[email protected]">Grey</a>
 * @date 2022/9/22
 * @since 19
 */
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) {
}

此外,在 JEP 432 中,Java SE 20 的 record 支持类型推断,例如,定义了如下数据结构

interface Multi<T> {}

record Tuple<T>(T t1, T t2) implements Multi<T> {}

record Triple<T>(T t1, T t2, T t3) implements Multi<T> {}

在 Java SE 20 之前,需要这样做

    // 需要指定类型
    static void preJDK20(Multi<String> multi) {
        if (multi instanceof Tuple<String>(var s1, var s2)) {
            System.out.println("Tuple: " + s1 + ", " + s2);
        } else if (multi instanceof Triple<String>(var s1, var s2, var s3)) {
            System.out.println("Triple: " + s1 + ", " + s2 + ", " + s3);
        }
    }

需要指定类型,例如:本实例需要指定 String 类型。

到了 Java SE 20,record 有类型推断,所以上述代码可以写成

    static void JDK20(Multi<String> multi) {
        if (multi instanceof Tuple(var s1, var s2)) {
            System.out.println("Tuple: " + s1 + ", " + s2);
        } else if (multi instanceof Triple(var s1, var s2, var s3)) {
            System.out.println("Triple: " + s1 + ", " + s2 + ", " + s3);
        }
    }

在循环中也可以支持类似的用法,示例如下:

在 Java SE 20 之前

record Position(int x, int y) {
}
static void preJDK20Loop(List<Position> positions) {
    for (Position p : positions) {
        System.out.printf("(%d, %d)%n", p.x(), p.y());
    }
}

在 Java SE 20 版本中,可直接写成如下形式

    static void JDK20Loop(List<Position> positions) {
        for (Position(int x, int y) : positions) {
            System.out.printf("(%d, %d)%n", x, y);
        }
    }

此外,在 Java SE 20 中,移除了对 record 命名模式的支持,在 Java SE 19 中,如下写法是对的

        if (object instanceof Points(int x, int y) points) {
            System.out.println("pre jdk 19 object is a position, x = " + points.x()
                    + ", y = " + points.y());
        }

但是到了 Java SE 20 ,已经将上述写法废弃,Java SE 20 只支持如下两种写法

     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());
        }

废弃 java.net.URL 的构造方法

java.net.URL的构造函数已被标记为"废弃"。应该使用URI.create(..)URI.toURL()方法。下面是一个例子:

package git.snippets.jdk20;

import java.net.URI;
import java.net.URL;

/**
 * URL的构造方法被彻底废弃
 *
 * @author <a href="mailto:[email protected]">Grey</a>
 * @date 2023/05/03
 * @since 20
 */
public class URLConstructorTest {
    public static void main(String[] args) throws Exception {
        // 以下构造方法在 Java SE 20 被彻底废弃
        // URL url = new URL("xxx");
        // Java SE 20 用如下方法构造 URL
        URL url = URI.create("xxx").toURL();
    }
}

更多

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

参考资料

Java Language Changes for Java SE 20

JDK 20 Release Notes

JAVA 20 FEATURES(WITH EXAMPLES)

标签:Java,int,object,System,20,SE
From: https://www.cnblogs.com/greyzeng/p/17249601.html

相关文章

  • java.Tang.CassNotFoundException javax.xmL.bind.DatatypeConverter
    报错如下图所示:故障原因:JAXBAPI是javaEE的API,因此在javaSE9.0中不再包含这个Jar包。java9中引入了模块的概念,默认情况下,JavaSE中将不再包含javaEE的Jar包而在java6/7/8时关于这个API都是捆绑在一起的解决方案:降低JDK版本到JDK8手动加入这些依赖......
  • java-对象在内存的运行机制
    面向对象Java是一种面向对象的编程语言。在Java中,一切都是对象,每个对象都有一组属性和方法。通过类来定义对象的属性和方法,一个类可以创建多个对象,每个对象都具有相同的属性和方法,但是它们的属性值可以不同。Java中的面向对象编程主要包括以下几个方面:封装:将对象的属性和方......
  • [JOI 2016 Final]断层 题解
    题目链接首先发现斜着平移比较难处理,所以考虑将平面逆时针旋转\(45°\)。接着发现风化也不好处理,但是风化的一定不会作为答案,所以我们可以离线,然后倒着处理操作,上升变为下降。我们发现每个初始\(0\)点最后的坐标就是它正着做时初始的坐标,且每次操作都只会将连续一段点的\(......
  • 2022CCPC Guilin Site E. Draw a triangle
    Drawatriangle题意:给定两点,求第三个整数点满足三点构成的非退化三角形面积最小分析:一开始看成了图论题,以为一直在卡精度(doge设\(A(x_1,y_1),B(x_2,y_2),C(x,y)\),则三角形面积由向量叉积求:\(2S=\vec{AB}×\vec{AC}\)\(\vec{AB}\)表示为\((x_2-x_1,y_2-y_......
  • 2023前端面试题一
    元素类型空元素brhr块级元素divfooterheadersectionph1h6行内元素imginputspan元素类型转换display:block独占一行,可以设置宽高display:inline不独占一行,不可以设置宽高display:inline-block不独占一行,可以设置宽高样式导入方式link@import......
  • smarty section循环显示一维数组元素
    <?phpheader("Content-type:text/html;charset=utf-8");//设置中国时区date_default_timezone_set('PRC');require_once("./Smarty/libs/Smarty.class.php");$smarty=newSmarty();$smarty->left_delimiter="<{";$sm......
  • 从0开始构建一个Oauth2Server服务 <19> Token 编解码
    Token编解码令牌提供了一种通过在令牌字符串本身中编码所有必要信息来避免将令牌存储在数据库中的方法。这样做的主要好处是API服务器能够验证访问令牌,而无需对每个API请求进行数据库查找,从而使API更容易扩展。OAuth2.0BearerTokens的好处是应用程序不需要知道您决定如......
  • Windows环境安装Elasticsearch和Kibana
    目录1Elasticsearch1.1下载1.2解压并添加环境变量1.3访问1.4cmd命令1.5中文分词器1.5.1下载1.5.2安装1.5.2.1命令安装1.5.2.2手动安装1.5.2.3验证分词1.6使用curl批量导入2安装kibana2.1下载kibana2.2中文界面2.3操作索引2.3.1增加索引2.3.1.1单条新增2.3.1.2......
  • 2023.5
    1.count感觉是一类组合计数的综合题。刚好可以完整梳理一下。首先长度为\(2n\)的合法括号串计数是最经典的问题:合法性可以转成\(+1/-1\)的序列来判断,则合法等价于和为\(0\)且任意前缀和非负。把过程看作是在网格图上游走,也就是\((0,0)\rightarrow(n,n)\)且不穿过\(y......
  • 关于AWS-ElastiCache-的Reserved_Cache_Nodes-预留节点-是没有多可用区的概念的
    今天在整理完善一个关于所有AWS账号的ElastiCache-的RN信息表格时,发现有一个字段要求写是否是多可用区笔者之前还没有注意过关于ElastiCache的RN的多可用区的问题,不过,像RDS确实有这个概念于是笔者去ElastiCache的 Purchasereservednodes界面又再次确认了一下,确实没有多可用......