Java 14引入switch表达式(预览),Java 17正式支持,→箭头语法实现无穿透分支、自动终止、无需break;支持多语句块+yield返回值;要求穷尽所有情况或含default;不可混用:与→语法。
java 14 开始引入 switch 表达式(预览),到 java 17 正式成为标准特性,其中 -> 箭头语法是核心改进之一:它让每个分支变成一个“表达式分支”,自动终止、不穿透(no fall-through),从而彻底消除对 break 的依赖。
箭头分支天然无穿透,无需 break
传统 switch 语句中,每个 case 后必须显式写 break,否则会继续执行后续 case(fall-through),容易引发逻辑错误。而使用 -> 的 switch 表达式中,每个分支是独立作用域,执行完自动退出,不会向下穿透。
例如:
✅ 使用 ->(简洁安全)String dayType = switch (day) {
case "Mon", "Tue", "Wed", "Thu", "Fri" -> "Weekday";
case "Sat", "Sun" -> "Weekend";
default -> "Unknown";
};
❌ 传统写法(需手动 break)String dayType;
switch (day) {
case "Mon": case "Tue": case "Wed": case "Thu": case "Fri":
dayType = "Weekday";
break; // 忘写就出错
case "Sat": case "Sun":
dayType = "Weekend";
break;
default:
dayType = "Unknown";
break;
}
支持多语句分支:用花括号 + yield 返回值
当一个分支需要执行多条语句时,不能直接写多行代码(箭头右边必须是表达式或语句块),此时用 { } 包裹,并用 yield 显式返回结果。
-
yield是 switch 表达式专用关键字,用于从块中返回值 - 块内可声明局部变量、调用方法、加条件判断等
- 仍无需
break,yield自动结束当前分支
示例:
int score = switch (grade) {
case "A" -> 90;
case "B" -> 80;
case "C" -> {
System.out.println("Passing, but needs improvement");
yield 70;
}
case "F" -> {
logFailure(grade);
yield 0;
}
default -> throw new IllegalArgumentException("Invalid grade: " + grade);
};
必须覆盖所有可能取值(或提供 default)
switch 表达式是“完备的”:编译器会检查是否穷举了所有可能的枚举常量、字符串字面量或基本类型值。若遗漏且无 default,编译失败。
- 对
enum类型,必须列出所有枚举项或加default - 对
String或int,虽无法静态穷举全部值,但要求有default分支兜底 - 这倒逼你主动处理异常/未知情况,提升健壮性
只能用于 switch 表达式,不能混用传统 case
-> 和 : 语法不可混用在同一 switch 中。一旦用了箭头,整个结构就是表达式,必须有返回值,且所有分支必须产生相同类型(或可统一为某类型)。
- 不能在箭头分支里写
break "value"—— 那是旧式带标签的跳转,已过时 - 不能省略
default(除非 switch 类型是 enum 且已列全) - 返回值类型由各分支共同推断,如出现
"A"和42会编译报错











