支持模式匹配
你可以认为模式匹配(pattern matching)是在 switch 关键字上进行了显著的功能扩充。 它是分成了多个模块、 历经了 Java 的多个版本持续实现的。这保证了每个模块在其他模块加入前都可以安全地运行。最后,所有的模块集中到一起,就产生了这个新特性。
这种拆分 现的方式使得人们在面对跨多个版本增加的多个“子特性”时会有点困惑。试图通过逐个分析各个单独模块来理解模式匹配并不是明智的选择。下面将所有支持模式匹配的模块都汇总到了一起——包括最新的 Java17 中增加的部分。
虽然模式匹配和枚举类型并不是绑定的关系,但是它解决了一些曾经由枚举类型来解决的问题。
switch 中的箭头语法
JDK 14 增加了在 switch 中使用一 种不同语法的 case 的能力。在下面的示例中 colons() 用的是旧方式,arrows() 用的是新方式:
ArrowInSwitch.java
import static java.util.stream.IntStream.range;
public class ArrowInSwitch {
static void colons(int i) {
switch (i) {
case 1:
System.out.println("one");
break;
case 2:
System.out.println("two");
break;
case 3:
System.out.println("three");
break;
default:
System.out.println("default");
}
}
static void arrows(int i) {
switch (i) {
case 1 -> System.out.println("one");
case 2 -> System.out.println("two");
case 3 -> System.out.println("three");
default -> System.out.println("default");
}
}
public static void main(String[] args) {
range(0, 4).forEach(i -> colons(i));
range(0, 4).forEach(i -> arrows(i));
}
}
运行结果如下:
注:未在 IDEA 的 JDK 列表中找到 JDK 14 下载选项,此处使用的是 JDK 20。
在 colons() 中,你可以看到为了防止继续向下执行,每个case语句(除了最后一个default 以外)后面都有必要加上 break。而在我们将 arrows() 中的冒号替换为箭头后, 便不再需要break语句了 然而这只是箭头的一部分功能而已。
你不能在同一个switch中同时使用冒号和箭头。