yield是Java中用于switch表达式的关键字,主要作用是返回对应分支的计算结果,让switch表达式可以直接作为值赋给变量或者参与后续运算。它和传统switch语句中的break有本质区别,break只是跳出分支,而yield会携带一个返回值。

yield的基本使用场景
yield只能在switch表达式的分支中使用,不能出现在传统的switch语句里。当我们需要让switch结构返回一个值时,就可以在每个分支中用yield指定返回的结果。
基础使用示例
下面是一个根据星期几返回对应描述的简单示例:
public class YieldDemo {
public static void main(String[] args) {
int day = 3;
// switch表达式直接返回值,赋值给result变量
String result = switch (day) {
case 1 -> "星期一";
case 2 -> "星期二";
case 3 -> {
// 分支有多行逻辑时,用yield返回结果
String desc = "星期三";
yield desc;
}
case 4 -> "星期四";
case 5 -> "星期五";
case 6, 7 -> "周末";
default -> "无效日期";
};
System.out.println(result);
}
}
带复杂逻辑的分支使用
如果某个switch分支需要执行多行逻辑再返回结果,就必须用大括号包裹分支代码,并且用yield返回最终值,不能直接用箭头表达式的简洁写法。
public class YieldComplexDemo {
public static void main(String[] args) {
int score = 85;
String level = switch (score / 10) {
case 10, 9 -> "优秀";
case 8 -> {
// 多行逻辑处理
if (score == 80) {
yield "良好(刚好80分)";
} else {
yield "良好";
}
}
case 7 -> "中等";
case 6 -> "及格";
default -> "不及格";
};
System.out.println("成绩等级:" + level);
}
}
yield的使用限制
yield的使用有严格的语法限制,违反这些限制会导致编译错误:
- yield只能出现在switch表达式的分支中,不能出现在传统switch语句里,也不能出现在其他任意代码位置。
- 如果switch分支使用了大括号包裹代码,那么分支内必须包含yield语句,否则编译会报错,因为switch表达式需要每个分支都有返回值。
- yield后面必须跟一个表达式或者值,不能直接写yield;这样的空语句。
- yield返回的值类型必须和switch表达式的目标类型一致,否则会出现类型不匹配的错误。
yield和break的区别
很多开发者会混淆yield和break的作用,两者的核心区别如下:
| 对比项 | yield | break |
|---|---|---|
| 适用场景 | 仅用于switch表达式的分支 | 可用于switch语句、循环语句 |
| 核心作用 | 返回switch分支的计算结果,同时结束当前分支 | 仅跳出当前switch分支或循环,不返回值 |
| 返回值 | 必须携带返回值 | 无返回值 |
注意事项
在使用yield时,还需要注意以下细节:
- 如果switch分支使用箭头表达式的简洁写法(比如
case 1 -> "结果"),不需要也不能写yield,这种写法会自动返回箭头后面的值。 - yield是Java 13引入的预览特性,在Java 14及之后的版本中才正式成为标准特性,如果使用低于Java 13的版本,无法使用yield关键字。
- 不要在循环中使用yield,循环中的类似功能可以用
return或者标签配合break实现,yield和循环没有关联。
注意:switch表达式本身是Java 14正式引入的标准特性,yield作为switch表达式的一部分,在Java 14及之后版本中可以直接使用,不需要开启预览特性。