Java 12 引入了 Switch 表达式功能,这可以用来简化许多原本冗长的 switch 语句。
switch 语句通常用于替代大量的 if 与 else if 判断,从而使代码更易读。不过,传统的 switch 语句自身也有些冗长,而且对 break 的严格要求也容易引发错误。switch 表达式就是为了解决这些问题而引入的:它更简洁、更不容易出错。
Switch 语句 vs Switch 表达式
它们的主要区别在于:
-
switch语句 只能对一个已定义的变量进行赋值更新。 -
switch表达式 本身会计算并返回一个值,因此可以直接赋值给变量。
此外,switch 表达式引入了一种新的箭头语法(->),进一步简化了代码的结构,提高了可读性,同时也不再需要使用 break 语句。
示例对比:
假设我们有一个枚举类用于“品尝”不同的事物,每种食物的评分是从 1 到 10,1 表示极其难吃,10 表示极其美味。
private enum ThingsToTaste { PIZZA, BROCCOLI, STEAK, SUGAR, DIRT, MEATBALLS, CHOCOLATE }
使用传统 switch 语句的写法:
int tasteValue = 0;
ThingsToTaste taste = ThingsToTaste.DIRT;
switch (taste) {
case SUGAR:
case PIZZA:
case CHOCOLATE:
tasteValue = 10;
break;
case MEATBALLS:
case STEAK:
tasteValue = 7;
break;
case BROCCOLI:
tasteValue = 4;
break;
case DIRT:
tasteValue = 1;
break;
default:
throw new IllegalStateException("Invalid tastable object: " + taste);
}
System.out.println(taste + ": " + tasteValue);
使用 switch 表达式的简洁写法:
int tasteValue = switch (taste) {
case SUGAR, PIZZA, CHOCOLATE -> 10;
case MEATBALLS, STEAK -> 7;
case BROCCOLI -> 4;
case DIRT -> 1;
default -> throw new IllegalStateException("Invalid tastable object: " + taste);
};
可以看到,这种写法更短更清晰:
-
不需要提前初始化
tasteValue。 -
每组相同的结果可以写在一行。
-
不需要
break,箭头->会自动停止并返回结果。 -
default分支仍然保留用于兜底处理。
switch 表达式的三种处理方式:
-
返回一个具体值(如整数、字符串等)
-
抛出异常(如
throw new IllegalStateException(...)) -
使用代码块并通过
yield返回值(Java 13 引入)
使用冒号语法 + yield(Java 13 起):
int tasteValue = switch (taste) {
case SUGAR:
case PIZZA:
case CHOCOLATE:
yield 10;
case MEATBALLS:
case STEAK:
yield 7;
case BROCCOLI:
yield 4;
case DIRT:
yield 1;
default:
throw new IllegalStateException("Invalid tastable object: " + taste);
};
注意:
-
yield只能用于switch表达式,不能用于switch语句。 -
与传统
break相比,yield更明确表示这个case会返回一个值。
箭头语法 + 代码块 + yield(适合需要多行操作的场景):
tasteValue = switch (taste) {
case SUGAR, PIZZA, CHOCOLATE -> {
System.out.println(10);
yield 10;
}
case MEATBALLS, STEAK -> {
System.out.println(7);
yield 7;
}
case BROCCOLI -> {
System.out.println(4);
yield 4;
}
case DIRT -> {
System.out.println(1);
yield 1;
}
default -> {
throw new IllegalStateException("Invalid tastable object: " + taste);
}
};
适用于你希望在返回值之前执行某些操作的场景(如打印、记录日志等)。
总结:
-
switch 表达式更简洁、易读,不易出错。
-
它直接返回值,因此可以被赋值给变量。
-
如果不是基于
enum,必须提供default分支以确保覆盖所有情况。 -
箭头语法
->是最推荐的写法。 -
Java 13 的
yield可用于多行代码块,进一步提高灵活性。 -
记住:
-
switch表达式 不能使用break。 -
switch 语句 不能使用
yield。
-
781

被折叠的 条评论
为什么被折叠?



