ystem.out.println(9);
}
还可以把switch语句当成一个表达式来处理:
T result = switch (arg) {
case L1 -> e1;
case L2 -> e2;
default -> e3;
};
static void howMany(int k) {
System.out.println(
switch (k) {
case 1 -> "one";
case 2 -> "two";
default -> "many";
}
);
}
还可以配合关键字yield,在复杂处理场景里,返回指定值:
int j = switch (day) {
case MONDAY -> 0;
case TUESDAY -> 1;
default -> {
int k = day.toString().length();
int result = f(k);
yield result;
}
};
还有吗?其实在JDK17中,还提出了Swtich 模式匹配的预览功能,可以做到更优雅的条件判断:
// 优化前
static String formatter(Object o) {
String formatted = "unknown";
if (o instanceof Integer i) {
formatted = String.format("int %d", i);
} else if (o instanceof Long l) {
formatted = String.format("long %d", l);
} else if (o instanceof Double d) {
formatted = String.format("double %f", d);
} else if (o instanceof String s) {
formatted = String.format("String %s", s);
}
return formatted;
}
// 优化后
static String formatterPatternSwitch(Object o) {
return switch (o) {
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 -> o.toString();
};
}
五、字符串压缩-Compact Strings(JEP254)
字符串是我们日常编程中使用最频繁的基本数据类型之一。目前,字符串类底层都使用了一个字符数组来实现,每个字符使用2个字节(16位)空间。实际上,大量的字符都属于Latin-1字符范围内,我们只需要一个字节就能存储这些数据,因此这里有巨大的可压缩空间;SPECjbb2005压测结果显示对于GC时间及GC时间间隔都有一定程度的提升。详细原理文档也可以参考【Oracle对CompackStrings分享】
六、 Java Flow API
Reactive Streams是一套非阻塞背压的异步数据流处理规范。从Java9开始,Java原生支持Reactive Streams编程规范。Java Flow API是对Reactive Streams编程规范的1比1复刻,同时意味着从Java9开始,JDK本身开始在Reactive Streams方向上进行逐步改造。
七、新一代JIT编译器 Graal
即时编译器在提高JVM性能上扮演着非常重要的角色。目前存在两JIT编译器:编译速度较快但对编译后的代码优化较低的C1编译器;编译速度较慢但编译后的代码优化较高的C2编译器。两个编译器在服务端程序及分层编译算法中扮演着非常重要的角色。但是,C2编译器已经存在将近20年了,其中混乱的代码以及部分糟糕的架构使其难以维护。JDK10推出了新一代JIT编译器Graal(JEP317)。Graal作为C2的继任者出现,完全基于Java实现。Graal编译器借鉴了C2编译器优秀的思想同时,使用了新的架构。这让Graal在性能上很快追平了C2,并且在某些特殊的场景下还有更优秀的表现。遗憾的是,Graal编译器在JDK10中被引入,但是在JDK17(JEP410)中被废除了,理由是开发者对其使用较少切维护成本太高。开发者也可以通过使用GraalVM来使用Graal编译器;
总结
本文介绍了JDK9-JDK17升级过的近200个JEP中作者狭隘角度认为价值较高的功能做了一个综述类介绍。主要目的有两个:
-
通过本文,大家可以对即将使用的JDK11及JDK17新特性有一个笼统的了解,希望可以看到一些Java预发最近几年的发展方向。
-
通过本文也可以看出,从JDK9到JDK17,Java生态还是生机勃勃。大量功能的更新意味着更优秀的性能及更高效的开发效率,积极主动的尝试高版本JDK;
当然,JDK8到JDK17还有需求优秀的新特性,例如:shanondoah垃圾回收器、Sealed Classes、Records;
鉴于本人能力有限,文中会出现一些漏洞,希望大家找出并指正,让本文成长为后续JDK17升级的扫盲手册;