java 14起引入switch表达式(java 17正式化),以箭头语法替代冒号,自动终止分支、无需break,支持多值case、yield返回、类型推断及穷尽性检查,显著提升安全性与简洁性。

Java 14 引入了 switch 表达式(作为预览特性),并在 Java 14+ 中持续改进,最终在 Java 17 成为正式特性。它比传统 switch 语句更简洁、更安全、更函数式——能直接返回值,无需 break 防止穿透,也支持多标签合并和表达式箭头语法。
基本写法:用箭头代替冒号,自动终止
传统 switch 语句容易因漏写 break 导致意外穿透;switch 表达式用 -> 替代 :,每个分支自动结束,不穿透:
String dayType = switch (day) {
case "Mon", "Tue", "Wed", "Thu", "Fri" -> "Weekday";
case "Sat", "Sun" -> "Weekend";
default -> "Invalid day";
};
- 每个分支后直接跟表达式或代码块,末尾不用分号(如果是单表达式)
- 多个 case 值可用逗号分隔,提升可读性
- 必须覆盖所有可能取值(或有
default),否则编译报错
处理复杂逻辑:用大括号写多行代码块
当某个分支需要多步操作或局部变量时,可用 { ... } 包裹,并用 yield 显式返回结果:
int result = switch (operation) {
case "add" -> a + b;
case "sub" -> a - b;
case "mul" -> {
System.out.println("Performing multiplication");
yield a * b;
}
case "div" -> {
if (b == 0) yield 0;
yield a / b;
}
default -> throw new IllegalArgumentException("Unknown op: " + operation);
};
- 带大括号的分支必须用
yield返回值,不能用return(除非在方法内且是 void 方法) -
yield是专为 switch 表达式设计的关键字,作用类似“从当前分支返回” - 仍需确保所有执行路径都有返回值,包括异常分支
类型推断与泛型友好:直接赋值给目标类型
switch 表达式的结果类型由各分支返回值共同推断,支持泛型上下文:
Optional<string> status = switch (code) {
case 200 -> Optional.of("OK");
case 404 -> Optional.empty();
case 500 -> Optional.of("Server Error");
default -> Optional.empty();
};
</string>- 所有分支返回类型需兼容(如都是
Optional<string></string>),否则编译失败 - 适合链式调用或作为方法参数,例如传给
Stream.of(...).filter(...) - 配合 var 使用更简洁:
var msg = switch (...) { ... };
与传统 switch 语句的区别要点
- switch 表达式是有返回值的表达式,必须参与赋值或作为参数等;传统 switch 是语句,无返回值
- 箭头分支不会穿透,无需
break;冒号分支(老写法)仍需break,且已不推荐用于新代码 - 表达式要求穷尽性检查(exhaustiveness),编译器会验证是否覆盖所有可能值(对枚举、sealed 类尤其严格)
- 支持
enum、String、int、byte、short、char及其包装类;Java 21+ 还支持sealed类型
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











