Java SE 20 新增特性

这篇具有很好参考价值的文章主要介绍了Java SE 20 新增特性。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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:410486047@qq.com">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:410486047@qq.com">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:410486047@qq.com">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)文章来源地址https://www.toymoban.com/news/detail-432663.html

到了这里,关于Java SE 20 新增特性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HTML5新增特性

    HTML从1993年发展开始到1999年,从1.0版本发展到4.01版本,4.01版本是一个通用版本,在很长一段时间制作HTML网页都是使用4.01版本。 后续发展版本号发生了变化,没有直接发展到HTML5,而是到2000年发展为XHTML1.0版本,这个版本是对之前4.01版本的一个严格化和升级,但是并没有增

    2024年04月23日
    浏览(38)
  • CSS3新增特性(二)

    • 属性名:transform (可用于制作2D转换,也可用于制作3D转转换;2D转换是平面上的转换,3D转换是在三维立体空间的转换) • 作用:对元素进行水平或垂直方向的 移动、缩放、旋转、拉长或拉伸 。 配合过渡和即将学习的动画知识,可以取代大量之前只能靠Flash才可以实现

    2024年04月25日
    浏览(42)
  • HTML5 新增内容 新特性

    number:数字; tel:电话; search:搜索; email:邮箱; url:地址; date:年月日; time:时分秒; month:月; week:周; time:时间; color:生成颜色选择表单; range:范围 原有 text:文本 radio:单选 password:密码 button:按钮 checkbox:多选 file:文件 image:图片 submit:提交 re

    2024年02月09日
    浏览(40)
  • PTA7-1 公路村村通 分数 20 作者 陈越 单位 浙江大学

    现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。 输入格式: 输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N);随后的M行对应M条道路,每行给出3个正整数,分别是该条道路

    2024年02月05日
    浏览(46)
  • .Net 6.0中的新增特性_.Net 6.0中的新增功能

    .Net 6.0中的新增特性_.Net 6.0中的新增功能 一、.Net 6 介绍 .NET 6 作为 LTS 长期支持版本,.NET 6 将会获得 3 年的技术支持。 .NET 6 是首个原生支持 Apple Silicon (Arm64) 的版本,并且还针对 Windows Arm64 进行了改进。 .NET 团队构建了一个新的动态配置文件引导优化 (PGO) 系统,该系统可提

    2024年02月05日
    浏览(67)
  • 【全面】CSS3新增了哪些新特性?

    目录 一、选择器的扩展 1.  属性选择器 2. 伪类选择器 3. 伪元素选择器 二、盒子模型的增强  1. box-sizing属性 2. 边框圆角(border-radius) 3. 盒阴影(box-shadow) 三、过渡和动画效果 1. 过渡效果 2. 动画效果 四、响应式布局 1. 媒体查询(media query) 2. 弹性布局(Flexbox)

    2024年02月07日
    浏览(37)
  • 开源进展 | WeBASE v3.1.0发布,新增多个实用特性

    WeBASE是一个友好、功能丰富的区块链中间件平台,通过一系列通用功能组件和实用工具,助力社区开发者更快捷地与区块链进行交互。 目前WeBASE已更新迭代至v3.1.0版本,本次更新中,WeBASE带来了最新的合约Java脚手架导出功能,完成达梦数据库适配,新增WeBASE CRUD预编译接口代

    2024年02月14日
    浏览(36)
  • javaScript蓝桥杯---新增地址

    网购大家应该再熟悉不过,网购中有个很难让人忽略的功能就是地址管理,接下来就让我们通过完善代码来探索下地址管理中常用功能的实现吧~ 本题需要在已提供的基础项目中使用 JS 知识完善代码,最终实现需求中的具体功能。 开始答题前,需要先打开本题的项目代码文

    2024年02月08日
    浏览(35)
  • 【从零开始学习C++ | 第二十一篇】C++新增特性 (上)

    目录  前言: 委托构造函数: 类内初始化: 空指针: 枚举类: 总结:         C++的学习难度大,内容繁多。因此我们要及时掌握C++的各种特性,因此我们更新本篇文章,向大家介绍C++的新增特性。 委托构造函数是指一 个类的构造函数调用另一个类的构造函数,以减少代

    2024年02月13日
    浏览(69)
  • 【从零开始学习C++ | 第二十二篇】C++新增特性(下)

    目录 前言: 类型推导: constexpr: 初始化列表: 基于范围的for循环: 智能指针之unique ptr Lambda表达式: 总结:         本文我们将继续介绍   C++ 11 新增十大特性的剩余六个,如果没有看过介绍前四个特性的小伙伴的可以点进我C++的专栏就可以看到。 类型推导(

    2024年02月14日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包