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; };
例如,把数字星期转换为中文名称:
立即学习“Java免费学习笔记(深入)”;
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,也不会“穿透”。
复杂逻辑分支:用花括号 + 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”


















