Java 12 对 switch 语法进行了重大升级,推出了 switch 表达式,允许 switch 结构直接作为表达式返回值,而 yield 关键字就是用来在 switch 表达式的分支中返回结果的核心语法,替代了传统 switch 语句中需要提前定义变量再赋值的方式。

yield 关键字的基本使用规则
yield 关键字只能在 switch 表达式的分支中使用,作用是返回当前分支的计算结果,并且每个分支都必须通过 yield 返回一个值,或者分支本身是一个抛出异常的语句,否则会编译报错。
传统 switch 语句如果需要返回结果,通常需要先定义一个变量,在分支中给变量赋值,最后返回变量,而使用 yield 可以直接在分支中返回结果,代码结构更紧凑。
基础使用示例
下面是一个根据星期几返回对应描述的简单示例,对比传统写法和新特性的写法:
// 传统 switch 语句写法
public static String getDayDescTraditional(int day) {
String desc;
switch (day) {
case 1:
desc = "星期一";
break;
case 2:
desc = "星期二";
break;
case 3:
desc = "星期三";
break;
default:
desc = "未知日期";
}
return desc;
}
// 使用 switch 表达式 + yield 的写法
public static String getDayDescNew(int day) {
return switch (day) {
case 1:
yield "星期一";
case 2:
yield "星期二";
case 3:
yield "星期三";
default:
yield "未知日期";
};
}
yield 使用的注意事项
- yield 后面必须跟一个表达式,该表达式的值就是当前分支的返回结果,类型需要和 switch 表达式的整体返回类型一致。
- 如果 switch 表达式的分支中包含了复杂的逻辑,需要先执行多行代码再返回结果,也可以使用 yield,此时分支需要用大括号包裹。
- yield 只能在 switch 表达式中生效,传统 switch 语句中使用 yield 会编译报错,不要混淆两者的使用场景。
- 如果分支中抛出了异常,就不需要使用 yield 返回结果,因为异常会中断流程,不会走到返回值这一步。
多行逻辑的分支示例
当分支需要执行多行代码再返回结果时,需要用大括号包裹分支逻辑,再使用 yield 返回:
public static int calculate(int type, int a, int b) {
return switch (type) {
case 1 -> a + b; // 箭头语法可以省略 yield,直接返回结果
case 2 -> a - b;
case 3 -> {
// 多行逻辑处理
int temp = a * b;
int result = temp / 2;
yield result; // 多行逻辑需要用大括号包裹,显式使用 yield 返回
}
default -> {
throw new IllegalArgumentException("不支持的计算类型");
}
};
}
switch 表达式中箭头语法与 yield 的关系
Java 12 的 switch 表达式同时支持两种分支语法,一种是传统的 case 标签加冒号,这种语法下必须使用 yield 返回结果;另一种是箭头语法(case 标签加箭头),这种语法下可以直接在箭头后面跟返回值,不需要写 yield,编译器会自动处理返回逻辑。
两种语法的返回效果是一致的,开发者可以根据分支逻辑的复杂程度选择使用,逻辑简单时用箭头语法更简洁,逻辑复杂时用传统冒号语法加 yield 更清晰。
两种语法对比示例
// 箭头语法,无需 yield
String desc1 = switch (day) {
case 1 -> "星期一";
case 2 -> "星期二";
default -> "其他";
};
// 冒号语法,必须用 yield
String desc2 = switch (day) {
case 1:
yield "星期一";
case 2:
yield "星期二";
default:
yield "其他";
};
注意:yield 关键字是 Java 12 新增的受限关键字,只有在 switch 表达式的上下文中才会被识别为关键字,在其他场景下仍然可以作为变量名使用,不过为了避免混淆,不建议在非 switch 表达式场景使用 yield 作为标识符。
Javayield_关键字switch_表达式分支返回修改时间:2026-06-26 18:18:38