【JavaSE】JDK17的一些特性

news/2024/9/23 19:15:00/

前言

springboot3.0开始,已经不⽀持JDK8

选⽤Java17,概括起来主要有下⾯⼏个主要原因

  • JDK17是LTS(⻓期⽀持版),可以免费商⽤到2029年。⽽且将前⾯⼏个过渡版(JDK9-JDK16) 去其糟粕,取其精华的版本
  • JDK17性能提升不少,⽐如重写了底层NIO,⾄少提升10%起步;
  • ⼤多数第三⽅框架和库都已经⽀持,不会有什么⼤坑;

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



目录

前言

yield关键字

密封类

接口中的私有方法

instanceof


yield关键字

yield关键字,从Java13开始引⼊。yield关键字⽤于从case的代码块中返回值

 简化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关键字代替->

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被引⼊

用于自动推导代码的类型,例如下面代码,编译器会⾃动推断出name是⼀个String类型,age是⼀个int类型。

    public static void main(String[] args) {var name ="zhangsan";var age =10;}

使⽤var可以使代码更简洁。有时候,类型名称可能会⾮常⻓,例如泛型。var就像是⼀个简化器,让 你不必反复写出繁琐的类型名。

例如下面代码中var根据后面的HashMap<String, List<Map<Integer, String>>>()自动推导类型 ,即这里的var代表Map<String, List<Map<Integer, String>>> 类型

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

注意:

  • 不能使⽤var来声明字段
  • 不能使⽤var来声明⽅法参数
  • 不能使⽤var来声明⽅法返回类型
  • var声明变量必须初始化,但是不能初始化为null

密封类

用fianl修饰的类不能被继承。

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

//这里的sealed表示密封类,与fianl不同的是,它可以使用permits开放给一些类继承
sealed class Person permits YL{}
//继承的类也要加上密封限制 non-sealed 表⽰不限制
non-sealed class YL extends Person{}

注意:

sealed修饰的类必须要有⼦类

使⽤ non-sealed 关键字修饰。表⽰不限制,任何类都可以继承。

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

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

接口中的私有方法

Java8,接⼝可以有默认⽅法。Java9之后,可以在接⼝内实现私有⽅法实现。

interface Hello{//默认方法default void saySomething(){}//私有方法private void sayEngHello(){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.ppmy.cn/news/1426076.html

相关文章

阿里云服务器2024年十大优惠活动,手动整理建议收藏!

2024年阿里云服务器优惠活动大全包括&#xff1a;云服务器新人特惠、云小站、阿里云免费中心、学生主机优惠、云服务器精选特惠、阿里云领券中心等&#xff0c;活动上阿里云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、ECS u1云服务器2核4G5M带宽199元一年&#xff0c;轻量…

探索ERC20代币:构建您的第一个去中心化应用

下面文章中会涉及到该资源中的代码&#xff0c;如果想要完整版代码可以私信我获取&#x1f339; 文章目录 概要整体架构流程技术名词解释ERC20智能合约web3.js 技术细节ERC20合约部署创建前端界面前端与智能合约互连运行DAPP 小结 概要 在加密货币世界中&#xff0c;ERC20代币…

Pytest精通指南(14)Parametrize之indirect(间接参数)

文章目录 官方概念概念分析官方示例示例分析验证indirect为True但不指定fixture验证indirect为True但不存在fixture 官方概念 概念分析 在pytest的pytest.mark.parametrize装饰器中&#xff0c;indirect参数用于指示是否应该从fixtures中解析参数值&#xff0c;而不是直接使用提…

Qt gsl库配置踩坑记录

想求解非线性方程组&#xff0c;之前使用拟牛顿法写过相关的matlab代码&#xff0c;这次想移植到C代码&#xff0c;网上说gsl库挺好用的&#xff0c;于是我也想试一下。相关参考&#xff1a; 【C】GSL(GNU Scientific Library) 的安装及在 Visual Studio 2017 中的使用 QT5使用…

getOutputStream() has already been called for this response

问题描述 在做java导出Excel数据的时候&#xff0c;接口层面需要有HttpServletResponse的入参来设置输出流 然后执行的时候报getOutputStream() has already been called for this response错误 问题排查 返回的错误信息 {"timestamp": "2024-04-16T11:49:…

比特币减半倒计时:NFT 生态将受到怎样的影响?

BTC 减半倒计时仅剩不到 1 天&#xff0c;预计在 4 月 20 日迎来减半。当前区块奖励为 6.25 BTC&#xff0c;减半后区块奖励为 3.125 BTC&#xff0c;剩余区块为 253。比特币减半无疑是比特币发展史上最重要的事件之一&#xff0c;每当这一事件临近&#xff0c;整个加密社区都充…

蓝桥杯2024年第十五届省赛真题-小球反弹

以下两个解法感觉都靠谱&#xff0c;并且网上的题解每个人答案都不一样&#xff0c;目前无法判断哪个是正确答案。 方法一&#xff1a;模拟 代码参考博客 #include <iostream> #include <cmath> #include <vector>using namespace std;int main() {const i…

Spring Boot入门(17):秒懂Spring Boot整合Knife4j,让你的Swagger界面秒变高颜值

前言 在使用Swagger进行API文档编写时&#xff0c;我们不可避免的会遇到Swagger的一些瓶颈。例如&#xff0c;Swagger的UI界面不太友好&#xff0c;样式单调且难看&#xff0c;交互体验也不是很好。为了解决这些问题&#xff0c;我们可以使用Knife4j对Spring Boot进行整合&…