传统的 switch 语句容易引发错误,如果其中某个 case 漏写了 break 语句,那么程序会继续往下执行直到遇到 break 语句,比如:

switch (age) {
    case 10:
        System.out.println("age is 10");
    case 20:
        System.out.println("age is 20");
        break;
    default:
        break;
}

case 10 处缺失了 break 语句,当程序匹配到 case 10 后,会继续往下执行,得到的输出是:

age is 10
age is 20

这显然不是我们想要的输出,这种因为缺少了 break 语句而引发的错误很常见,我们写代码的时候一不小心就会漏写 break 语句。

Java 12 中首次提及 switch 语句改进,而在 Java 13 中这种改进得到更进一步的提高。具体有:

  1. 支持一个 case 匹配多个值,以往我们匹配多个值的时候需要写多个 case 语句,如:
switch (age) {
    case 10:
    case 20:
    case 30:
        System.out.println("");
}

现在可以这样写:

switch (age) {
    case 10, 20, 30:
        System.out.println("");
}
  1. 添加 yield 关键字yield 可以返回 switch 一个分支的值,且不用添加 break 语句就能从分支中退出:
int val = switch (age) {
    case 10:
        yield 0;
    case 20:
        yield 1;
}
  1. 添加作用域标识,在 case 之后添加 {} 可以使这个 case 中的语句与其他 case 中的语句隔离开来;如果我们在传统的 case 语句中声明变量,那么这些变量的作用域是整个 switch 语句:
switch (age) {
    case 10 :
        int b = 0;
        break;
    case 20:
        int b = 1;    // 报错:`b` is already defined in the scope
        break;
}

改进之后:

switch (age) {
    case 10: {
        int b = 0;
        break;
    }
    case 20: {
        int b = 1;    // 编译通过
        break;
    }
}

注意,添加 {} 作用域后仍需要写上 break 语句。

  1. 支持箭头表达式,如:
switch (age) {
    case 10 -> age++; 
    case 20 -> throw new IllegalArgumentException(age);
    case 30 -> {
        age++;
        System.out.println(age);
    }
}

箭头右侧支持:

  • 语句 / 表达式;
  • throw 语句;
  • {} 作用域;

使用箭头表达式的好处是不用写 break 语句,Java 只会匹配一个 case。

参考资料:
enhancements-for-switch-statement-in-java-13


把酒言欢
2 声望1 粉丝

苟日新,日日新。