Java 14 引入 switch 表达式(JEP 361),支持箭头语法(->)和 yield 关键字,解决传统 switch 的 break 易错、作用域混乱等问题;Java 15 正式可用,Java 17 起稳定支持并扩展类型模式与空安全。

Java 14 引入了 switch 表达式(JEP 361),它不只是语句,还能直接返回值;Java 14 是预览特性,Java 15 正式可用,Java 17 起稳定支持。核心变化在于支持 箭头语法(->) 和 yield 关键字,彻底告别传统 switch 的 break 易错、作用域混乱、无法直接赋值等问题。
箭头写法(->)替代冒号(:),自动终止分支
传统 switch 使用 : 和显式 break,容易遗漏导致“fall-through”;新表达式中每个分支用 -> 声明,执行完右侧表达式后自动跳出,无需 break。
示例对比:
// 传统语句(易错)
int day = 3;
String desc;
switch (day) {
case 1 -> desc = "Monday"; // ❌ 编译错误:不能用 -> 在语句 switch 中
}
<p>// 正确的 switch 表达式(Java 14+)
String desc = switch (day) {
case 1 -> "Monday";
case 2 -> "Tuesday";
case 3 -> "Wednesday";
default -> "Unknown";
};</p>支持多语句分支:用花括号 + yield 返回值
当一个分支需要执行多条语句(如日志、计算、条件判断),不能再直接写表达式,需用 {} 包裹,并用 yield 显式指定返回值(类似 return,但专用于 switch 表达式)。
立即学习“Java免费学习笔记(深入)”;
-
yield必须出现在块内,且只能出现在最外层作用域(不能在 if/for 内部直接 yield) - 块内其他语句照常执行,yield 后不再执行后续语句
String result = switch (x) {
case 1 -> "one";
case 2 -> {
System.out.println("Processing two");
int temp = x * 10;
yield temp + " (doubled)";
}
default -> "other";
};
模式匹配与空安全(Java 17+ 扩展)
Java 17(JEP 406)为 switch 表达式增加了 类型模式(type patterns),可直接对对象做 instanceof + 强转 + 分支处理,避免冗余判空和重复转型。
注意:必须确保所有可能类型都被覆盖(包括 null),否则编译报错。
Object obj = "hello";
String msg = switch (obj) {
case String s -> "It's a string: " + s.length();
case Integer i -> "It's an integer: " + i;
case null -> "Got null";
default -> "Unknown type";
};
语法要点与限制
- switch 表达式必须穷尽所有可能取值(enum 值、已知整数范围、或有 default),否则编译失败
- case 标签仍只支持常量、枚举常量、null(Java 17+)、类型模式(Java 17+),不支持变量或表达式
- 不能混用传统冒号语法和箭头语法(即不能在一个 switch 中既有
case 1:又有case 2 ->) - 返回类型由所有分支表达式的类型共同推断(要求统一或存在公共父类型)










