常用的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类型,如果是创建临时变量strSystem.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.等等更多的知识,期待着同学们去探索!

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

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

相关文章

Node+Vue3+mysql+ant design实现前后端分离——表格的添加、修改和删除

在上一篇文章中,我们分享了如何运用NodeJS、Vue、MySQL以及其他技术来实现后台管理系统中的表格查询功能。今天,我们将继续探讨另外三个重要的功能实现原则。这些原则在构建后台管理系统时至关重要,同时还有导入和导出这两种功能也必不可少。关于导入和导出功能,我们会在下…

CUDA的开发框架

CUDA的开发框架主要提供了一系列工具和库,使得开发者可以充分利用NVIDIA GPU进行高效的并行计算。以下是CUDA开发框架的一些关键组成部分。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.CUDA核心库:这些是构…

C++设计模式:中介者模式(十五)

1、定义与动机 定义:用一个中介对象来封装(封装变化)一系列的对象交互。中介者使各个对象不需要显示的相互引用(编译时依赖 -> 运行时依赖),从而使其耦合松散(管理变化)&#xff…

vue3+node.js+mysql+ant design实现表格的查询功能

今日主要分享如何运用vue、nodejs、mysql及ant design构建表格数据查询功能,这也是众多项目开发者关注的问题。最关键在于前端与后端的协作,后端数据则通过nodejs编写。尽管涉及多项技术,看似复杂,但实际操作却并非困难。当然&…

LM324的输出VOL与IOL你注意过吗?

电路图 途中LMC6084 更改为LM324 故障现象 这个电路的输入输出表达式为 R30 两端电压等于0V 当J16 的4脚与2脚相等,等于5V(或者4脚略大于2脚时)7脚输出 约 500mV; 实际应该为0V左右才对.见下图 故障原因 上图运放输出低电平…

【ENSP】VRRP配置方法

VRRP配置步骤 1.配置虚拟ip地址作为网关,进行切换路由器 2.配置vrrp优先级,越大越优先 3.配置延迟抢占时间 4.配置备份组监视接口 AR1路由器配置 u t m #关闭提示 sys …

创建Maven项目的时候让选择maven模板

创建Maven项目的时候让选择maven模板 心得 工欲利其事 必先利其器。如果你想要干成一件事 那么必须先要精通对应的工具使用。之前我不太注重工具 我觉得只要代码写的好就可以了 但是当我们了解了产品经理的一些思想之后,我才明白一个好的产品是可以给用户提供多大…

wasm 系列之 WebAssembly 和 emscripten 暴力上手

wasm 是什么? wasm 是 WebAssembly 的缩写。wasm 不是传统意义上的汇编语言,而是一种编译的中间字节码,可以在浏览器和其他 wasm runtime 上运行非 JavaScript 类型的语言,只要能被编译成 wasm,譬如 kotlin/wasm、Rus…

IOS恢复

1、实验目的 通过本实验可以掌握: copy方式恢复IOS的步骤。TFTPDNLD方式恢复IOS的步骤。Xmodem方式恢复IOS的步骤。 2、实验拓扑 路由器IOS恢复的实验拓扑如下图所示。 3、实验步骤 如果工作中不慎误删除路由器IOS,或者升级了错误版本的IOS&#xff…

Https协议原理剖析【计算机网络】【三种加密方法 | CA证书 】

目录 一,fidler工具 前提知识 二,Https原理解析 1. 中间人攻击 2. 常见的加密方式 1). 对称加密 2). 非对称加密 对称加密 4). CA证书 1. 数据摘要 3. 数字签名 CA证书 理解数据签名 存在的安全疑问&am…

js基础知识(2)

一、事件的含义 JavaScript事件是指在文档或者浏览器中发生的一些特定交互瞬间,比如打开某一个网页,浏览器加载完成后会触发load事件,当鼠标悬浮于某一个元素上时会触发hover事件,当鼠标点击某一个元素时会触发click事件等等。 三…

在PostgreSQL中如何处理跨表的级联删除和更新?

文章目录 解决方案1. 使用外键约束和级联操作创建外键约束并指定级联删除创建外键约束并指定级联更新 2. 使用触发器(Triggers)创建触发器实现级联删除 示例代码示例1:使用外键约束和级联删除示例2:使用触发器实现级联删除 在Post…

Golang | Leetcode Golang题解之第44题通配符匹配

题目: 题解: func isMatch(s string, p string) bool {for len(s) > 0 && len(p) > 0 && p[len(p)-1] ! * {if charMatch(s[len(s)-1], p[len(p)-1]) {s s[:len(s)-1]p p[:len(p)-1]} else {return false}}if len(p) 0 {retur…

输入influx但是无法进入influxdb

问题描述: 博主想通过DockerJmeterInfluxDBGrafana搭建性能测试可视化平台,但是按照别的教程输入influx却无法进入inluxdb,输入输出如下: NAME:influx - Influx ClientUSAGE:influx [command]HINT: If you are looking for the I…

Linux下的进程管理:创建、终止、切换与等待

文章目录 一、引言二、进程创建1、进程创建的概念与场景2、进程创建的方式a、fork() 系统调用b、fork() 后的执行流程 3、进程创建的过程a、进程创建过程b、子进程创建过程 4、父子进程关系与属性继承 三、进程终止1、进程终止的原因2、进程的错误码和退出码a、错误码b、退出码…

LeetCode:51. N 皇后

leetCode51.N皇后 题解分析 代码 class Solution { public:int n;vector<vector<string>> ans;vector<string> path;vector<bool> col, dg,udg;vector<vector<string>> solveNQueens(int _n) {n _n;col vector<bool> (n);dg …

《QT实用小工具·四十二》圆形发光图像

1、概述 源码放在文章末尾 该项目实现了图像的发光效果&#xff0c;特别适合做头像&#xff0c;项目demo演示如下所示&#xff1a; 项目部分代码如下所示&#xff1a; import QtQuick 2.7 import QtGraphicalEffects 1.12Item {id: rootwidth: 80height: 80property int ra…

浓眉大眼的Apple开源OpenELM模型;IDM-VTON试衣抱抱脸免费使用;先进的语音技术,能够轻松克隆任何人的声音

✨ 1: openelm OpenELM是苹果机器学习研究团队发布的高效开源语言模型家族 OpenELM是苹果机器学习研究团队开发的一种高效的语言模型&#xff0c;旨在推动开放研究、确保结果的可信赖性、允许对数据和模型偏见以及潜在风险进行调查。其特色在于采用了一种分层缩放策略&#x…

spring基本使用

文章目录 1. ioc(Inversion of Control) | DI(Dependency Injection)(1) maven坐标导包(2) 编写配置文件bean.xml(3) 配置bean(4) 配置文件注入属性 2. DI(dependency injection) 依赖注入(setter)其他属性(1) 对象属性注入(2) 数组属性输入(3) 集合属性注入(4) map集合注入(5)…

如何提交已暂存的更改到本地仓库?

文章目录 如何提交已暂存的更改到本地Git仓库&#xff1f;步骤1&#xff1a;确认并暂存更改步骤2&#xff1a;提交暂存的更改到本地仓库 如何提交已暂存的更改到本地Git仓库&#xff1f; 在Git版本控制系统中&#xff0c;当你对项目文件进行修改后&#xff0c;首先需要将这些更…