在 JDK14 中,Switch 语法被进一步完善,变得更加现代,方便易用。
Switch 语法一个一直被诟病的问题是,case 之间如果不显式地 break 或者 return,代码会继续执行下一个 case 代码。
诚然这在某些情况下还挺好用的。但是这也是个很容易出 bug 的特性。
JDK14 引入了箭头标记,允许开发者在一个 case 中匹配多个条件。同时 Switch 可以作为表达式参与到编码中。也就是说,Switch 可以直接把结果返回外部了。
新的 Switch 语法引入了 "case L ->" 标记。
新的语法不再需要显式break,并且支持一次指定多个匹配条件。
switch (today) {
case SATURDAY, SUNDAY -> System.out.println("放假啦!");
case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, -> System.out.println("只想摸鱼,无心上班...");
};
箭头的右边需要是一个表达式(expression)、代码块或者 throw 语句(throw statement)。简而言之,你可以这样玩:
String msg = switch (today) {
case MONDAY, TUESDAY, THURSDAY, FRIDAY -> {
String s = "工作日正常上班";
yield s;
}
case WEDNESDAY -> "周三闭馆维护";
case SATURDAY, SUNDAY -> throw new RuntimeException("周末放假");
};
yield
紧接着会解释。
以前,Switch 是一个语句(statement)。这意味着它本身不能携带一个返回值。
现在,Switch 可以是一个表达式。
再次引用上面的例子:
String msg = switch (today) {
case MONDAY, TUESDAY, THURSDAY, FRIDAY -> {
String s = "工作日正常上班";
yield s;
}
case WEDNESDAY -> "周三闭馆维护";
case SATURDAY, SUNDAY -> throw new RuntimeException("周末放假");
};
可以看到,switch 执行结束后,其结果被赋值给 msg 变量。
新的yield
标志符用于在代码块中,"返回"对应的结果。
注意,switch语句和switch表达式是两个概念,不要混淆。
switch语句不支持"返回"一个值,不可以使用 yield。
switch表达式不可以 return,不可以 break,不需要"返回"一个值。
但两者都可以使用新的箭头标记。