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

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

前言

之前一直用的是 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 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3169 引用 • 8207 回帖

相关帖子

欢迎来到这里!

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

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