前言:

从springboot3.0开始,已经不支持JDK8了。
参考资料,来自官方博客:https://spring.io/blog/2022/01/20/spring-boot-3-0-0-m1-is-nowavailable?spm=a2c6h.12873639.article-detail.24.766d46b40LM1IV
从3.0开始,转变为JDK17。

JDK 17 是 LTS (长期支持版),可以免费商用到 2029 年。而且将前面几个过渡版(JDK 9-JDK 16)去其糟粕,取其精华的版本;

所以这篇文章我们来介绍一些在JDK8以后的新特性


一、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) ;
    }

可以对这个代码做简化处理

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

var name = "zhangsan";
var age = 10;

可以看到我们的变量定义时,没有加类型,编译器会自动推断出name是⼀个String类型,age是⼀个int类型。

它的用处在于泛型定义的类有繁杂的类型名,我们可以使用 var 来代替掉,使代码变得简洁。

但是使用 var 需要注意以下几个问题

1. 不用来声明成员变量(字段)

2. 不能用于 方法的 参数/返回类型 

3. var 声明的局部变量 必须 初始化,且不能初始化为 null


三、密封类 sealed 关键字

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

// sealed 关键字
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 {
}
//最简单的用法就是这样,乱改不符合要求,很麻烦

四 、接口中的封装方法

Java 8,接口 可以有默认方法。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; 
 ...
}

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

 

if (obj instanceof String str) {

// obj是否为String类型,如果是创建临时变量str 
 
}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐