IMLC.ME
/jdk14/JDK14 Switch 表达式(Switch Expression)/

JDK14 Switch 表达式(Switch Expression)

在 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 表达式和 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,不需要"返回"一个值。
但两者都可以使用新的箭头标记。

References

JEP 361: Switch Expressions