JDK 14发布版本正式支持switch表达式。具体包括:在switch语句中使用箭头标号语法;case 条件,多个可以写在一行,用逗号分开;可以省略 break 关键字;switch可以作为表达式直接返回一个值。具体标准参见https://openjdk.java.net/jeps/361。
例如,下面定义的方法rangeOf ( )中,switch语句中使用了箭头标签(Arrow Labels),case 条件中使用多个字面常量,并且省略了break语句:
static void rangeOf(int k) {
switch (k) {
case 1,2,3 -> System.out.println("Ranking one");
case 4,5,6,7,8,9 -> System.out.println("Ranking two");
default -> System.out.println("Not Ranked");
}
}
连续使用如下的方法方法调用:
rangeOf (1);
rangeOf (19);
rangeOf (8);
会得到如下的输出结果:
Ranking one
Not Ranked
Ranking two
switch语句扩展成为switch表达式的基本语法为:
<目标类型> result = switch (<参数>) {
case Label1 -> <表达式1>;
case Label2 -> <表达式2>;
……
default -> <表达式n>;
};
如果<目标类型>确定,整个switch表达式的类型就是目标类型;如果<目标类型>不确定,那么 switch 表达式类型就是各 case 分支的表达式计算出来的独立类型。
大多数情况下 case 标号箭头("case Label ->")后面是单个表达式,对于后面由多条语句构成的语句块,可以在最后使用 yield 语句来返回 switch 表达式值。例如:
int j = switch (s) {
case "BJTU" -> 1;
case "SSE" -> 2;
default -> {
System.out.println("Neither BJTU nor SSE, hmmm...");
yield 0;
}
};
yield语句也可以用于传统的case 标号("case Label :")下,返回一个值并结束switch表达式。例如:
int result = switch (s) {
case "BJTU":
yield 1;
case "SSE":
yield 2;
default:
System.out.println("Neither BJTU nor SSE, hmmm...");
yield 0;
};