java 12起switch支持表达式语法,以switch(value) -> { ... }形式书写,用yield返回值,禁止fall-through,需覆盖所有情况或含default,编译器自动推断统一返回类型。

从 Java 12 开始,switch 不再只是语句(statement),还支持作为表达式(expression)使用,配合 yield 可以直接返回每个分支的计算结果,代码更简洁、类型更安全、逻辑更清晰。
switch 表达式的基本写法(Java 12+)
与传统 switch 语句不同,表达式必须有明确的返回值,所有分支需覆盖全部可能情况(或有 default),且每个分支用 yield 显式返回值。
- 语法以
switch (value) -> { ... }开头(箭头符号,不是冒号) - 每个
case后直接跟表达式或代码块,末尾用yield返回结果 - 不允许 fall-through,无需
break - 编译器会推断表达式的返回类型(需所有
yield类型兼容)
简单示例:根据枚举返回字符串描述
假设有一个表示星期的枚举:
enum Day {
MON, TUE, WED, THU, FRI, SAT, SUN
}
用 switch 表达式配合 yield 获取中文名称:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
String cnName = switch (day) {
case MON -> yield "星期一";
case TUE -> yield "星期二";
case WED -> yield "星期三";
case THU -> yield "星期四";
case FRI -> yield "星期五";
case SAT -> yield "星期六";
case SUN -> yield "星期日";
};
注意:此处每个 case 后是单表达式,可省略花括号和 yield(Java 14 起支持简写),但显式写 yield 更清晰、兼容性更好。
复杂分支:在代码块中使用 yield
当某个分支需要多行逻辑时,必须用花括号包裹,并在最后用 yield 返回值:
int score = switch (grade) {
case "A" -> yield 90;
case "B" -> yield 80;
case "C" -> {
System.out.println("及格了");
yield 70; // 必须有 yield,且只能有一个
}
case "D", "F" -> yield 0;
default -> yield -1;
};
- 多个 case 值可用逗号分隔(如
"D", "F") -
default分支必不可少(除非枚举已穷举且编译器能确认全覆盖) - 块内不能用
return,只能用yield向外返回
类型推断与常见注意事项
switch 表达式的类型由所有 yield 的值共同决定。例如:
- 全为
String→ 表达式类型是String - 混用
Integer和int→ 推断为Integer(自动装箱) - 若某
yield null,而其他是String,类型仍是String(允许 null) - 若分支返回不同类型(如
String和Integer),编译失败
另外:yield 只能在 switch 表达式内部使用,不可用于传统 switch 语句或方法体中。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










