Switch表达式
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
。
-