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

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.等等更多的知识,期待着同学们去探索!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值