新增的JDK17语法特性

news2024/10/7 4:25:18

一、引入

从springboot3.0开始,已经不支持JDK8了,从3.0开始,转变为JDK17

了解详情点击官方博客链接:https://spring.io/blog/2022/01/20/spring-boot-3-0-0-m1-is-now-available?spm=a2c6h.12873639.article-detail.24.766d46b40LM1IVhttps://spring.io/blog/2022/01/20/spring-boot-3-0-0-m1-is-nowavailable?spm=a2c6h.12873639.article-detail.24.766d46b40LM1IVhttps://spring.io/blog/2022/01/20/spring-boot-3-0-0-m1-is-nowavailable?spm=a2c6h.12873639.article-detail.24.766d46b40LM1IV

二、yield关键字 

yield 关键字,从Java13开始引入

yield 关键字用于从case的代码块中返回值

普通的 switch 语句:

public static void main(String[] args) {
    String data = "one" ;
    int result = 0 ;     // 接收数据的返回值
    switch (data) {
        case "one":
            result = 1 ; // 为result重新赋值
            break ;
        case "two":
            result = 2 ; // 为result重新赋值
            break ;
        default:
            result = -1 ; // 为result重新赋值 
            break ;
    }
    System.out.println(result) ;
}

简化版的 switch: 

public static void main(String[] args) {
    String data = "one" ;
    int result = switch (data) {
        case "one"->1;
        case "two"->2;
        default->-1;
    };
    System.out.println(result) ;
}

使用 yield 后的 switch :

public static void main(String[] args) {
    String data = "one" ;
    int result = switch (data) {
        case "one" : yield 1;
        case "two": yield 2;
        default : yield -1;
    };
    System.out.println(result) ;
}

三、var关键字 

从Java10开始,var 关键字被引入

public static void main(String[] args) {

    var name = "zhangsan";
    var age = 10;
}
// 在这段代码中,编译器会⾃动推断出name是⼀个String类型,age是⼀个int类型

使用var可以使代码更简洁

有时候,类型名称可能会非常长,例如泛型

var就像是一个简化器,让你不必反复写出繁琐的类型名 

示例:

public static void main(String[] args) {
    Map<String, List<Map<Integer, String>>> complexMap = new HashMap<String,
                    List<Map<Integer, String>>>();

    var complexMap2 = new HashMap<String, List<Map<Integer, String>>>();

}

 注意:

        1. 不能使用var来声明字段 

        2. 不能使用var来声明方法参数 

        3. 不能使用var来声明方法返回类型

        4. var声明变量必须初始化,但是不能初始化为null

示例:

class OrgCat {
    public var name;        // error

    public var eat(var str) {        // error

    }

}
public static void main(String[] args) {
    var complexMap2 = 10;
    System.out.println(complexMap2);

    var str = null;        // error
}

四、空指针异常 

出现异常的具体方法和原因都是一目了然

如果你的一行代码中有多个方法、多个变量,可以快速定位问题所在

如果是 JDK1.8,有些情况下真的不太容易看出来

JDK8:

JDK17:

五、密封类 

密封类一般应用在类和接口中,对接口和类的实现和继承进行约束,主要使用的关键字是 final

当这个类被 final 修饰了,被修饰的类就变成完全封闭的状态了,所有类都没办法继承

JDK17提供了一个新的关键字: sealed  密封类除了可以被该关键字修饰,并且在声明末尾使用 permits 表示要开放给哪些类型

示例:

// Animal 为密封类,然后使⽤ permits 关键字,把继承权限开放给了 Dog 类
sealed class Animal permits Dog{
    public String name;
    public int age;
    public void eat() {
        System.out.println("eat()....");
    }
}
//继承的类也要加上密封限制 non-sealed 表示不限制 
non-sealed class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println(this.name+ "正在吃狗粮....");
    }
}

注意: 

        1. sealed 修饰的类必须要有子类

sealed class Animal {
    public String name;
    public int age;
    public void eat() {
        System.out.println("eat()....");
    }
}
sealed class Dog extends Animal{        
    @Override       // Sealed class must have subclasses,此时Dog 被 sealed 修饰,那么Dog 必须要有⼦类!!
    public void eat() {
        System.out.println(this.name+ "正在吃狗粮....");
    }
}

        2. 使用 non-sealed 关键字修饰,表示不限制,任何类都可以继承 

sealed class Animal {
    public String name;
    public int age;
    public void eat() {
        System.out.println("eat()....");
    }
}
non-sealed class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println(this.name + "正在吃狗粮....");
    }
}

        3. 未被 permits 允许的类型,则没办法继承  

sealed class Animal permits Dog {
    public String name;
    public int age;
    public void eat() {
        System.out.println("eat()....");
    }
}
non-sealed class PetDog extends Animal {
    
}

正确的做法:

sealed class Animal permits Dog,PetDog {
    public String name;
    public int age;
    public void eat() {
        System.out.println("eat()....");
    }
}
non-sealed class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println(this.name+ "正在吃狗粮....");
    }
}
non-sealed class PetDog extends Animal {
}

六、接口中的私有方法

Java8,接口可以有默认方法

Java9之后,可以在接口内实现私有方法

示例:

interface HelloService {
    public void sayHello();
    // 默认⽅法 
    default void saySomething(){
        syaEngHello();
        sayHello();
    };
    // 私有⽅法 
    private void syaEngHello(){
        System.out.println("Hello!");
    }
}

七、instanceof 

示例:

   if (obj instanceof String) {
       String str = (String) obj; 
       ...
   }

上面的instancof语法做了三件事:

        1. 判断是否为 String 类型 

        2. 如果是,转成 String 类型

        3. 创建⼀个名为 str 的临时变量

在JDK16中,使用模式匹配思想改进了 instanceof 用法,可以做到以下优化效果:

if (obj instanceof String str) {  // obj是否为String类型,如果是创建临时变量str 

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1815986.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最新下载:CorelDraw 2023【软件附加安装教程】

简介&#xff1a; CorelDRAW Graphics Suite 订阅版拥有配备齐全的专业设计工具包&#xff0c;可以通过非常高的效率提供令人惊艳的矢量插图、布局、照片编辑和排版项目。价格实惠的订阅就能获得令人难以置信的持续价值&#xff0c;即时、有保障地获得独家的新功能和内容、一流…

目标检测6:采用yolov8, RK3568推理的性能

最近有个小伙伴&#xff0c;问我rk3568上推理图片&#xff0c;1秒能达到多少&#xff1f; 本次采用模型为yolov8s.rknn&#xff0c;作了一次验证。 解析一段视频文件&#xff0c;1280*720, fps 24。读取视频文件&#xff0c;然后进行推理。 通过性能优化&#xff0c;发现推理…

RPA实战案例解析,一文看懂RPA工作原理

在这个快节奏的时代&#xff0c;我们渴望更多时间追求梦想。面对电脑前堆积的数据录入和商品上架等重复工作&#xff0c;我们感到束缚。然而&#xff0c;RPA机器人——这位“数字精灵”&#xff0c;正悄然改变我们的生活。它不仅是工具&#xff0c;更是我们工作的伙伴和创新的助…

Codesys中根据时间生成随机数字

一、 说明 LTIME()函数返回LTIME 时间类型数据 这个函数产生自系统启动以来经过的时间&#xff0c;以纳秒为单位&#xff0c;以扫描周期1ms为例&#xff0c;这个函数每次获得的纳妙数是随机的&#xff0c;没有规律。 二、作用 例如用来生成0到100的随机数&#xff0c;可以用L…

WebSocket 基础使用

1.基本概念 WebSocket 支持双方通信即服务端可以主动推送给用户端&#xff0c;用户端也可以主动推送消息给服务器。前端必须进行协议升级为 WebSocket 名称值Upgradewebsocket 2. 后端代码 package com.koshi.websocket.server;import com.alibaba.fastjson.JSON; import com…

互联网医院系统源码的创新应用:预约挂号小程序开发实战

预约挂号小程序作为互联网医院系统的创新应用&#xff0c;更加贴近用户需求&#xff0c;实现了预约挂号的便捷化和智能化。本篇文章&#xff0c;笔者将带领读者进入预约挂号小程序开发的实战过程&#xff0c;探索互联网医院系统源码在小程序开发中的创新应用。 一、互联网医院系…

【大模型应用开发极简入门】微调(一):1.微调基础原理介绍、2. 微调的步骤、3. 微调的应用(Copilot、邮件、法律文本分析等)

文章目录 一. 开始微调1. 选择合适的基础模型2. 微调和少样本学习2.1. 对比微调和少样本学习2.2. 微调需要的数据量 二. 使用OpenAI API进行微调1. 数据生成1.1. JSONL的数据格式1.2. 数据生成工具1.3. 数据文件的细节注意 2. 上传数据来训练模型3. 创建微调模型4. 列出微调作业…

用 Kotlin 多平台开发构建跨平台应用程序:深入探索 KMP 模板工程

用 Kotlin 多平台开发构建跨平台应用程序&#xff1a;深入探索 KMP 模板工程 Kotlin 多平台开发 (KMP) 是一种强大的工具&#xff0c;可用于构建跨平台移动、桌面和 Web 应用程序。它提供了一种统一的代码基础&#xff0c;使开发人员能够高效地针对多个平台开发应用程序。 KM…

解密有道翻译响应数据末尾出现乱码问题的解决方法

运行解密响应数据程序&#xff1a; D:\Python\Python311\python.exe E:\baichuan\youdaos.py {"code":0,"dictResult":{"ce":{"word":{"trs"D:\Python\Python311\python.exe E:\baichuan\youdaospdm.pyD:\Python\Python31…

ESP32s3与Lsm6ds3通信---i2c【开源】

接线 ESPS3&#xff0c;I2C的初始化 #ifdef __cplusplus extern "C" { #endif #define I2C_MASTER_SCL_IO CONFIG_I2C_MASTER_SCL /*!< GPIO number used for I2C master clock */ #define I2C_MASTER_SDA_IO CONFIG_I2C_MASTER_SDA …

鸿蒙轻内核A核源码分析系列五 虚实映射(5)虚实映射解除

虚实映射解除函数LOS_ArchMmuUnmap解除进程空间虚拟地址区间与物理地址区间的映射关系&#xff0c;其中参数包含MMU结构体、解除映射的虚拟地址和解除映射的数量count,数量的单位是内存页数。 ⑴处函数OsGetPte1用于获取指定虚拟地址对应的L1页表项数据。⑵处计算需要解除的无效…

【文献阅读】一种多波束阵列重构导航抗干扰算法

引言 针对导航信号在近地表的信号十分微弱、抗干扰能力差的问题&#xff0c;文章提出了自适应波束形成技术。 自适应波束形成技术可以分为调零抗干扰算法和多波束抗干扰算法。 调零抗干扰算法主要应用功率倒置技术&#xff0c;充分利用导航信号功率低于环境噪声功率的特点&…

Navicat平替软件汇总,各种数据库连接软件

文章目录 1、Navicat2、DataGrip3、Chat2DB4、DBeaver Community5、SQLyog6、beekeeper studio参考文档 1、Navicat 作者最喜欢的数据库连接软件Navicat premium 15安装教程报错解决办法 2、DataGrip 个人感觉界面作者就不喜欢&#xff0c;不爱用IDEA同一家公司出的下载地址…

线程池处理Runnable任务

1、线程池处理Runnable任务 1.1、ThreadPoolExecutor创建线程池对象示例 ExecutorService pools new ThreadPoolExecutor&#xff08;3&#xff0c;5&#xff0c;8&#xff0c;TimeUnit.SECONDS&#xff0c;new ArrayBlockingQueue<>(6)&#xff0c;Executors.default…

iOS/iPadOS18Beta是否值得升级体验?Bug汇总和升级办法分享!

苹果昨天发布了iOS/iPadOS18Beta更新&#xff0c;引入了诸多新功能/新特性&#xff0c;很多喜欢尝鲜的用户已经在第一时间进行了升级。 iOS/iPadOS18Beta目前存在不少Bug&#xff0c;建议暂时不要更新&#xff0c;轻则浪费装机时间&#xff0c;重则丢失相关数据&#xff0c;甚至…

【产品经理】ERP对接电商平台

电商ERP对接上游平台&#xff0c;会需要经历几个步骤环节&#xff0c;包括店铺设置等。 电商ERP对接上游电商平台&#xff0c;其主要设置为店铺设置、商品同步、库存同步&#xff0c;本次讲解下店铺设置应该如何进行设置&#xff0c;以及在设置过程中的可能出现的踩坑事项。 …

王德峰视频讲座,王德峰视频全部大全集,百度云百度网盘资源下载

王德峰教授的视频讲座其内容丰富、观点独到&#xff0c;深受广大学者和爱好者的喜爱。很多朋友想下载王德峰教授的讲座视频&#xff0c;今天我给大家分享一个下载王德峰教授视频的方法 搜索 “方圆资源网官网” 打开 “方圆资源网官网&#xff0c;找到王德峰教授的讲座 总之&a…

3D gaussian-splatting项目环境配置记录

1.前景 项目论文&#xff1a;https://arxiv.org/abs/2308.04079 GitHub项目下载地址&#xff1a;https://github.com/graphdeco-inria/gaussian-splatting git clone时里面的子模块小项目会git不到&#xff0c;需要单独github下来&#xff0c;放入相应文件夹。 sibr_viewer…

GUI编程03-事件监听

事件监听是指当某个事件发生的时候干一些什么。 例如之前在关闭frame窗口时就写过一个window窗口监听&#xff0c;当点击左上角❌时调用System.exit进行程序关闭。 1.按钮监听 下面的例子是监听按钮Button被点击时触发的事件 同时我们将窗口关闭监听事件进行了优化&#xff…

【多线程】进程与线程

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. 操作系统2. 进程2.1 进程是什么2.2 进程管理2.3 进程调度2.3 内存管理2.4 进程间通信 3. 线程3.1 线程是什…