前提
JDK19于2022-09-20发布GA版本,本文将会详细介绍JDK19新特性的使用。
新特性列表
新特性列表如下:
JPE-405:Record模式(预览功能)
JPE-422:JDK移植到Linux/RISC-V
JPE-424:外部函数和内存API(预览功能)
JPE-425:虚拟线程,也就是协程(预览功能)
JPE-426:向量API(第四次孵化)
JPE-427:switch匹配模式(第三次预览)
JPE-428:结构化并发(孵化功能)
新特性使用详解
下面就每个新特性介绍其使用方式。
Record模式
使用Record模式增强Java编程语言以解构Record值。可以嵌套Record模式和Type模式,以实现强大的、声明性的和可组合的数据导航和处理形式。这个描述看起来有点抽象,下面举几个JEP-405的例子结合文字理解一下。以JDK16扩展的instanceof关键字下使用Type模式来看:
// JDK16以前
private static void oldInstanceOf(Object x) {
if (x instanceof String) {
String s = (String) x;
System.out.println(s);
}
}
// JDK16或之后启用instanceof下的Type模式
private static void newInstanceOfTypePattern(Object x) {
if (x instanceof String s) {
System.out.println(s);
}
}
Type模式在JDK17和JDK18扩展到switch预览功能中,应用于其case标签:
// DEMO-1
private static void switchTypePattern(String s) {
switch (s) {
case null -> System.out.println("NULL");
case "Foo", "Bar" -> System.out.println("Foo or Bar");
default -> System.out.println("Default");
}
}
// DEMO-2
interface Shape{}
class Rectangle implements Shape{}
class Triangle implements Shape{
public int calculateArea(){
return 200;
}
}
private static void switchTypePatternForShape(Shape shape) {
switch (shape) {
case null:
break;
case Rectangle r:
System.out.printf("Rectangle[%s]\n", r);
break;
case Triangle t:
if (t.calculateArea() > 100) {
System.out.printf("Large triangle[%s]\n", t);
}
default:
System.out.println("Default shape");
}
}
// DEMO-3 patterns in labels
private static void switchTypeForLabels(Object x) {
String formatted = switch (x) {
case Integer i -> String.format("int => %d", i);
case Long l -> String.format("long => %d", l);
case Double d -> String.format("double => %f", d);
case String s -> String.format("string => %s", s);
default -> x.toString();
};
}
本次的Record