JDK17 你必须知道的一些新特性

本贴最后更新于 791 天前,其中的信息可能已经渤澥桑田

前言

之前一直用的是 jdk8,不过新项目上了 Spring Boot3.0,必须要用 jdk17 了,所以了解下 jdk8 之后的一些新特性吧~

本地变量 var

jdk10 提供的:

#原先我们需要这么定义 Test t = new Test(); #现在这样定义 var t1 = new Test();

其实就是一个语法糖,虚拟机可不认识 var,编译成字节码的时候,还是会找到变量的真正类型的。跟 java 的泛型机制差不多。

Switch 表达式

jdk13 引入了 yield,先来看下我们原先怎么写的:

int i; switch(x) { case "1": i = 1; break; case "2": i = 2; break; case "3": i = 3; break; default: i = x.length(); }

jdk13 我们可以写成:

int i = switch(x) { case "1" -> 1; case "2" -> 2; case "3" -> 3; default -> { int len = x.length(); yield len; } }

或者:

int i = switch(x) { case "1": yield 1; case "2": yield 2; case "3": yield 3; default -> { int len = x.length(); yield len; } }

这里的 yield 只是用来返回一个值,跟 return 不太一样,yield 只会跳出当前的 switch 块。

Text Blocks

jdk13 提供,现在写多行字符串方便多了,看下面的例子:

""" <html> <head>Title</head> <body> <p>Body</p> </body> </html> """

Records

jdk14 新特性,用来申明一个简单类的,这个类里面只有字段,编译器会自动创建所有方法并让所有字段参与 hashCode 等方法。

record Person(String name, Integer age){}

封闭类

很多场景中,我们写的接口或者父类,只允许我们指定范围的类去实现或者继承,这个时候就可以用到封闭类。关键字是 sealed,permits

public sealed interface Service permits Car,Truck { }

定义了一个封闭接口,只允许 Car、Truck 来实现。

继承也是一样的

public abstract sealed class Vechile permits Car,Truck { }

定义了一个抽象类 Verchile 只允许 Car 和 Truck 来继承

instanceof 模式匹配

我们以前一般在强转之前用来做判断的,比如:

if(animal instanceof Cat) { Cat cat = (Cat) animal; cat.eat(); } else if (animal instanceof Dog) { Dog dog = (Dog) animal; dog.eat();

jdk14 中可以简写了:

if(animal instanceof Cat) { cat.eat(); } else if (animal instanceof Dog) { dog.eat(); }

强转那部分代码可以不用写了,更加的直观。

Switch 模式匹配

基于 instanceof 模式匹配这个特性,我们可以使用如下方式来处理对象 o

public static String formatter(Object o) { String formatted = ""; if(o instanceof Integer i) { formatted = String.format("int %d", i); } else if (o instanceof Long l) { formatted = String.format("long %d", l); } ...... }

jdk17 中 switch 中的 case 还可以模式匹配,我们可以通过 switch 改写如下:

public static formatterPatternSwitch(Object o){ return switch(o) { case Integer i -> String.format("int %d",i); case Long l -> String.format("long %d",l); ...... default -> o.toString(); } }

switch 处理的是 Object,而且也不是精确匹配,而是模式匹配了。

差不多就这些~

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3201 引用 • 8217 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...