Java 13 的 switch 表达式支持 yield 返回值,需用 -> 语法、每个分支有且仅有一个 yield,必须穷尽所有情况,类型由各 yield 值的最小公共上界推断。

Java 13 引入了 switch 表达式(JEP 354),它支持用 yield 关键字从某个分支中返回值,从而让 switch 不仅能控制流程,还能直接产出结果。这比传统语句式 switch 更简洁、更安全(避免漏写 break)、也更适合函数式风格。
yield 是 switch 表达式的“return”
yield 不是语句,而是专门用于 switch 表达式内部的跳转操作,作用是在匹配分支中提供该表达式的计算结果。它只能出现在 switch 表达式的 case 或 default 标签块内,且每个分支必须有且仅有一个可到达的 yield(或抛出异常)。
-
yield后面跟一个与表达式声明类型兼容的值 - 不能在传统语句式
switch中使用yield - 整个
switch表达式必须“穷尽”所有可能输入(或有default),否则编译报错
基本语法:带返回值的 switch 表达式
格式为:type result = switch (expr) { case ... -> yield value; default -> yield defaultValue; };
例如,把数字星期转换为中文名称:
String dayName = switch (dayOfWeek) {
case 1 -> yield "周一";
case 2 -> yield "周二";
case 3 -> yield "周三";
case 4 -> yield "周四";
case 5 -> yield "周五";
case 6 -> yield "周六";
case 7 -> yield "周日";
default -> yield "未知";
};
注意:这里用的是箭头 -> 形式,每个分支是单表达式,yield 直接跟在后面;不需要 break,也不会“穿透”。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
复杂逻辑分支:用花括号 + yield
当某个分支需要多条语句(如计算、判断、日志等),可用花括号包裹,并在末尾显式写 yield:
String category = switch (score) {
case int s when s >= 90 -> yield "优秀";
case int s when s >= 80 -> {
System.out.println("良好档,正在记录...");
yield "良好";
}
case int s when s >= 60 -> yield "合格";
default -> yield "不及格";
};
要点:
- 花括号内可执行任意代码,但必须以
yield(或throw)结束 - 支持模式匹配(如
case int s)和守卫条件(when)——这是 Java 14+ 增强特性,需配合使用 - 变量
s在对应分支内有效,类型由模式推断
类型推断与常见陷阱
switch 表达式的类型由所有 yield 的值共同决定,编译器会取它们的最小公共上界(LUB)。例如:
- 全为
String→ 表达式类型为String - 有
"ok"和null→ 类型为String(null可赋给引用类型) - 混用
Integer和Long→ 类型为Number,不是Object
常见错误:
- 遗漏
default且输入类型不是enum或已知有限集 → 编译失败(非穷尽) - 某个分支没有
yield(比如只写了System.out.println()就结束)→ 编译报错:“missing yield” - 在语句式
switch中误用yield→ 编译报错:“yield not allowed here”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










