常用的JDK9-JDK17的一些新增语法特性

目录

  • 1.前言
  • 2.一些新增的特性
    • 2.1 yield关键字
    • 2.2 var关键字
    • 2.3 空指针异常
    • 2.4 密封类
    • 2.5 接口中的私有方法
    • 2.6 instanceof
    • 2.7 其他

1.前言

从springboot3.0开始,已经不⽀持JDK8了。参考资料 :Spring官方博客。从3.0开始,转变为JDK17。
在这里插入图片描述
官方维护的版本都是SpringBoot3.X的了, 但是之前的版本也是可以用的, 只是官放不再进行功能更新了。
在这里插入图片描述
综上所述,选⽤用Java 17,概括起来主要有下面几个主要原因:
1.JDK 17 是 LTS (长期支持版),可以免费商用到 2029 年。而且将前面几个过渡版(JDK 9-JDK 16)去其糟粕,取其精华的版本;
2.JDK 17 性能提升不少,比如重写了底层 NIO,至少提升 10% 起步;
3.大多数第三方框架和库都已经支持,不会有什么大坑;

2.一些新增的特性

2.1 yield关键字

yield关键字,从Java13开始引⼊。yield关键字用于从case的代码块中返回值。
普通的switch语句:

public static void main(String[] args) {
        String str="one";
        int result;
        switch (str){
            case "one":
                result=1;
                break;
            case "two":
                result=2;
                break;
            case "three":
                result=3;
                break;
            default:
                result=0;
                break;
        }
        System.out.println(result);
    }

简化后的switch:

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

如果不想使用指向符-> 可以使用yield来代替:

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

2.2 var关键字

从Java10开始,var被引入

var a="zhangsan";
var b=10;

上述代码中,编译器会⾃动推断出name是⼀个String类型,age是⼀个int类型。
为什么使用var?
使用var可以使代码更简洁。有时候,类型名称可能会非常长,例如泛型。var就像是⼀个简化器,让你不必反复写出繁琐的类型名。举例如下
在这里插入图片描述
使用注意事项:
1.不能使用var来声明字段
在这里插入图片描述
2.不能使用var来声明方法参数
在这里插入图片描述
3.不能使用var来声明方法返回类型
4.var声明变量必须初始化,但是不能初始化为null
在这里插入图片描述

2.3 空指针异常

出现异常的具体方法和原因都一目了然。如果你的一行代码中有多个方法、多个变量,可以快速定位问题所在,如果是 JDK1.8,有些情况下真的不太容易看出来。
在这里插入图片描述
在这里插入图片描述

2.4 密封类

密封类⼀般应用在类和接口中,对接口和类的实现和继承进行约束。主要使⽤的关键字是 final。当这个类被 final 修饰了,被修饰的类就变成完全封闭的状态了,所有类都没办法继承。
JDK17提供了⼀个新的关键字: sealed.密封类除了可以被该关键字修饰,并且在声明末尾用permits 表示要开放给哪些类型。
下述代码Person为密封类,然后使用permits 关键字,把继承权限开放 给了GGB 类

sealed class Person permits GGb{

}
final class GGb extends Person{

}

继承后的类同样要加密封性质,使用final、sealed或者no-sealed。
注意事项
1.sealed修饰的类必须要有子类
在这里插入图片描述
2.使用 non-sealed 关键字修饰。表示不限制,任何类都可以继承。

sealed class Person permits GGB{

}
non-sealed class GGB extends Person{
    
}
class GB extends GGB{
    
}

3.未被permits允许的类型没办法继承
在这里插入图片描述

2.5 接口中的私有方法

Java 8, 接口可以有默认方法。Java9之后,可以在接口内实现私有方法实现。

interface Test1{
    private void eat(){

    }
}

2.6 instanceof

public static void main(String[] args) {
        String obj=null;
        if(obj instanceof String){
            System.out.println("hehe");
        }
    }

上⾯的instanc of语法⼀共做了三件事:
1.判断是否为String类型;
2.如果是,转成String类型;
3.创建⼀个名为str 的临时变量;
JDK16中,使用模式匹配思想改进了instanceof 用法,可以做到以下优化效果:

public static void main(String[] args) {
        String obj="hello";
        if(obj instanceof String str){// obj是否为String类型,如果是创建临时变量str
            System.out.println("hehe");
        }
    }

2.7 其他

其他还有很多未列举到的,比如:
1.ZGC-新⼀代垃圾回收器、G1垃圾回收器相关等等
2.record 类的使用
3.Stream API的部分改进
4.HttpClient 重写了,⽀持 HTTP2.0
5.支持 List.of()、Set.of()、Map.of()和Map.ofEntries()等工厂方法实例化对象
6.等等更多的知识,期待着同学们去探索!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用windows端MySQL创建数据库

1.命令行登录数据库 命令:mysql -u用户名 -p密码; 切记命令后面要以分号结尾 2. 查看和创建数据库 查看数据库命令:show database; 创建数据库命令:mysql> create database db_classes; 创建一个名为db_classes的…

【漏洞复现】WebLogic XMLDecoder反序列化(CVE-2017-10271)

1、漏洞描述 CVE-2017-10271漏洞产生的原因大致是Weblogic的WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,导致可执行任意命令。攻击者发送精心构造的xml数据甚至能…

AIGC算法3:Attention及其变体

1.Attention Attention是Transformer的核心部分,Attention机制帮助模型进行信息筛选,通过Q,K,V,对信息进行加工 1.1 attention计算公式 Attention ⁡ ( Q , K , V ) softmax ⁡ ( Q K T d k ) V \operatorname{Attention}(Q, K…

找不到mfc140.dll如何解决?mfc140.dll丢失的几种解决方法分享

在我们启动并开始利用电脑进行日常工作的过程中,如果遭遇了操作系统提示“mfc140.dll文件丢失”的错误信息,导致某些应用程序无法正常运行,这究竟是何种情况呢?小编将介绍计算机缺失mfc140.dll文件的5种解决方法,帮助大…

二叉树数据结构详解及java使用二叉树示例代码

二叉树详解: 二叉树是一种常见的树形数据结构,它由节点组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。 二叉树组成: 节点(Node): 每个节点包含三个要素:数…

【AI学习】RAG与推荐系统

一、《双塔模型的瓶颈究竟在哪?》 文章介绍了谷歌的一篇论文,《Large Dual Encoders Are Generalizable Retrievers》 文章主要在讲,稠密检索模型在OOD(Out-Of-Distribution,即域外)泛化能力不行&#xff…

【Pytorch】(十五)模型部署:ONNX和ONNX Runtime

文章目录 (十五)模型部署:ONNX和ONNX RuntimeONNX 和 ONNX Runtime的关系将PyTorch模型导出为ONNX格式使用Netron可视化ONNX模型图检查ONNX模型验证ONNX Runtime推理结果使用ONNX Runtime运行超分模型 (十五)模型部署&…

外贸干货|真正的销售高手,都很会提问

你的产品性价比很高,为什么客户没有买单呢? 最重要的原因是你没有了解到他真正的需求。 真正的销售高手,应该是一个提问高手,至少要连续问对方6个问题,问出客户的真实需求。 假如他回答你的问题,你有一种&a…

git 冲突与解决冲突

目录 1.使用 git 解决冲突 GIT 常用命令 制造冲突 解决冲突 2.使用 IDEA 解决冲突 产生冲突 解决冲突 1.使用 git 解决冲突 GIT 常用命令 命令作用git clone克隆git init初始化git add 文件名添加到暂存区git commit -m " 日志信息" 文件名提交到本地库git st…

【运维自动化-配置平台】如何通过模板创建集群和模块

通过【每天掌握一个功能点】配置平台如何创建业务机拓扑(集群-模块)我们知道了直接创建集群和模块的操作方法,直接创建的方式适合各集群模块都相对独立的场景,那大量的、标准规范的集群模块如何快速创建呢,这里就引入了…

条件生成对抗网络(cGAN)在AI去衣技术中的应用探索

随着深度学习技术的飞速发展,生成对抗网络(GAN)作为其中的一个重要分支,在图像生成、图像修复等领域展现出了强大的能力。其中,条件生成对抗网络(cGAN)通过引入条件变量来控制生成模型的输出&am…

面试十五 容器

一、vector容器 template<typename T> class Allocator{ public:T* allocator(size_t size){// 负责内存开辟return (T*)malloc(sizeof(T) * size);}void deallocate(void * p){free(p);}void construct(T*p,const T&val){// 定位newnew (p) T(val);}void destroy(…

Golang对接Ldap(保姆级教程:概念搭建实战)

Golang对接Ldap&#xff08;保姆级教程&#xff1a;概念&搭建&实战&#xff09; 最近项目需要对接客户的LDAP服务&#xff0c;于是趁机好好了解了一下。LDAP实际是一个协议&#xff0c;对应的实现&#xff0c;大家可以理解为一个轻量级数据库。用户查询。比如&#xff…

DiT论文精读Scalable Diffusion Models with Transformers CVPR2023

Scalable Diffusion Models with Transformers CVPR2023 Abstract idea 将UNet架构用Transformer代替。并且分析其可扩展性。 并且实验证明通过增加transformer的宽度和深度&#xff0c;有效降低FID 我们最大的DiT-XL/2模型在classconditional ImageNet 512、512和256、256基…

switch语句深讲

一。功能 1.选择&#xff0c;由case N:完成 2.switch语句本身没有分支功能&#xff0c;分支功能由break完成 二。注意 1.switch语句如果不加break&#xff0c;在一次判断成功后会执行下面全部语句并跳过判断 2.switch的参数必须是整形或者是计算结果为整形的表达式,浮点数会…

centos 7 yum install -y nagios

centos 7 systemctl disable firewalld --now vi /etc/selinux/config SELINUXdisabled yum install -y epel-release httpd nagios yum install -y httpd nagios systemctl enable httpd --now systemctl enable nagios --now 浏览器 IP/nagios 用户名&#xff1a;…

stack,queue的模拟实现以及优先级队列

这篇博客用来记录stack&#xff0c;queue的学习。 stack的模拟实现 stack的模拟实现比较简单&#xff0c;先上代码 #pragma once #include<vector> #include<list> #include<deque> #include<iostream> using std::deque; using namespace std;name…

【STM32HAL库】外部中断

目录 一、中断简介 二、NVIC 1.寄存器 2.工作原理 3.优先级 4.使用NVIC 三、EXTI 1.简介 2.AFIO&#xff1a;复用功能IO&#xff0c;主要用于重映射和外部中断映射配置​编辑 3. 中断使用 4.HAL库配置使用 一、中断简介 中断的意义&#xff1a;高效处理紧急程序&#xff0c;不会…

树莓派学习笔记--串口通信(配置硬件串口进行通信)

树莓派串口知识点 树莓派4b的外设一共包含两个串口&#xff1a;硬件串口&#xff08;/dev/ttyAMA0&#xff09;,mini串口&#xff08;/dev/ttyS0&#xff09; 硬件串口由硬件实现&#xff0c;有单独的波特率时钟源&#xff0c;性能高&#xff0c;可靠&#xff1b;而mini串口性能…

Java-AQS的原理

文章目录 基本概述1. 设计思想2. 基本实现 一些关键词语以及常用术语&#xff0c;主要如下&#xff1a; 信号量(Semaphore): 是在多线程环境下使用的一种设施&#xff0c;是可以用来保证两个或多个关键代码段不被并发调用&#xff0c;也是作系统用来解决并发中的互斥和同步问题…