java 14引入switch表达式(预览),java 17正式标准化,支持箭头语法、自动终止、yield返回、类型推断及sealed类匹配,彻底消除fall-through错误。

Java 14 开始引入 switch 表达式(作为预览特性),Java 17 正式成为标准特性,它让 switch 不再只是语句,还能直接返回值,同时大幅简化语法、避免 fall-through 和冗余 break。
用箭头语法替代冒号 + break
旧写法需显式 break 防止穿透,易出错;新写法用 -> 绑定分支逻辑,自动终止,不穿透:
// Java 12+(表达式写法)
String dayType = switch (day) {
case "Mon", "Tue", "Wed", "Thu", "Fri" -> "Weekday";
case "Sat", "Sun" -> "Weekend";
default -> "Invalid day";
};
说明:多个 case 可用逗号分隔;每个分支右侧必须是表达式、代码块或 throw;整个 switch 是一个表达式,可直接赋值。
支持代码块并用 yield 返回值
当分支需要多行逻辑,可用大括号包裹,并用 yield 显式返回结果(不能用 return):
int result = switch (value) {
case 1 -> 100;
case 2 -> {
System.out.println("Processing 2");
yield 200; // 必须有 yield
}
default -> throw new IllegalArgumentException("Unknown: " + value);
};
注意:带代码块的分支必须包含且仅包含一个 yield(或 throw),否则编译报错。
类型推断更智能,支持任意引用类型和基本类型
switch 表达式支持 String、enum、int、byte、short、char 及其包装类,Java 21 还扩展支持 sealed 类(配合 pattern matching)。所有分支返回类型必须统一,编译器自动推导:
- 若所有分支都返回 int,整个表达式类型就是 int
- 若混合返回 Integer 和 int,结果为 Integer(自动装箱)
- 若某分支抛异常,不影响类型推断(异常不参与类型计算)
不再允许隐式 fall-through,彻底消除漏写 break 的 bug
老式 switch 中忘记 break 会导致意外穿透,新版完全禁止。即使写成传统冒号形式(不推荐),也不再穿透:
// ❌ 编译错误:case 标签后不能跟语句(除非用 -> 或 { })
// String s = switch (x) {
// case 1: "one"; // 错误!缺少 -> 或 {}
// };
<p>// ✅ 正确写法只有两种风格:
// - 箭头风格(推荐):case ... -> ...
// - 代码块风格:case ... -> { ... yield ...; }</p>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











