yield 关键字
从 switch 代码块生成值
yield 关键字 是 CoddyKit 上的免费 Java Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。
一行代码不够时
像 case 1 -> 42; 这样的箭头分支会直接返回一个值。但是,如果分支在产生值之前需要执行多条语句,该怎么办?这正是 yield 发挥作用的地方。
yield 关键字
在代码块分支 { } 中,yield 关键字会提供 switch 表达式产生的值。您可以把它理解为 return,但它只用于 switch 分支。
public class Main {
public static void main(String[] args) {
int n = 3;
int result = switch (n) {
case 3 -> {
int squared = n * n;
yield squared;
}
default -> 0;
};
System.out.println(result);
}
}代码块中的 yield
您可以先在代码块中执行任意逻辑,然后调用 yield。代码块执行的最后一项操作应当是 yield 一个值。
public class Main {
public static void main(String[] args) {
int amount = 250;
String label = switch (amount / 100) {
case 0 -> "small";
default -> {
System.out.println("Computing label...");
yield "large";
}
};
System.out.println(label);
}
}混合使用箭头分支和代码块分支
一个 switch 表达式可以混合使用简单的箭头分支和通过 yield 返回值的代码块分支。请根据每种情况选择合适的形式。
public class Main {
public static void main(String[] args) {
int code = 2;
String msg = switch (code) {
case 1 -> "One";
case 2 -> {
String s = "T" + "wo";
yield s;
}
default -> "Other";
};
System.out.println(msg);
}
}yield 前的计算
当需要计算一个值时,代码块分支非常合适。在这里,我们会先对数字求和,然后通过 yield 返回总和。
public class Main {
public static void main(String[] args) {
int category = 1;
int value = switch (category) {
case 1 -> {
int sum = 0;
for (int i = 1; i <= 5; i++) {
sum += i;
}
yield sum;
}
default -> 0;
};
System.out.println(value);
}
}yield 与 return
yield 只会退出 switch 分支,并返回一个值。return 则会退出整个方法。在 switch 表达式的代码块中,请使用 yield。
public class Main {
static int classify(int n) {
int rank = switch (n) {
case 0 -> 0;
default -> {
yield (n > 0) ? 1 : -1;
}
};
return rank;
}
public static void main(String[] args) {
System.out.println(classify(-7));
}
}旧式冒号写法中的 yield
冒号形式的 switch 也可以用作表达式,此时使用 yield 而不是 break。每个带标签的部分都会返回自己的值。
public class Main {
public static void main(String[] args) {
int day = 2;
String name = switch (day) {
case 1: yield "Mon";
case 2: yield "Tue";
default: yield "Other";
};
System.out.println(name);
}
}条件式 yield
代码块分支可以包含 if 逻辑,并在不同路径上返回不同的值。每条路径都必须返回一个值。
public class Main {
public static void main(String[] args) {
int temp = 30;
String advice = switch (temp / 10) {
case 3 -> {
if (temp > 35) {
yield "Very hot";
}
yield "Warm";
}
default -> "Mild";
};
System.out.println(advice);
}
}返回对象
yield 适用于任何类型,包括对象。在这里,一个分支会构建并通过 StringBuilder 产生一个 String 结果。
public class Main {
public static void main(String[] args) {
int count = 3;
String stars = switch (count) {
case 0 -> "";
default -> {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < count; i++) {
sb.append("*");
}
yield sb.toString();
}
};
System.out.println(stars);
}
}可读性提示
当一个值就足够时,请优先使用简单的箭头分支。只有当分支确实需要额外语句时,才使用代码块和 yield。这样可以让您的 switch 保持整洁。
public class Main {
public static void main(String[] args) {
int level = 2;
int xp = switch (level) {
case 1 -> 100;
case 2 -> {
int base = 100;
yield base * 2;
}
default -> 0;
};
System.out.println(xp);
}
}完整示例
综合运用:一个同时使用箭头分支和代码块分支的超文本传输协议风格状态映射器。
public class Main {
public static void main(String[] args) {
int status = 404;
String message = switch (status / 100) {
case 2 -> "Success";
case 4 -> {
String base = "Client error ";
yield base + status;
}
case 5 -> "Server error";
default -> "Unknown";
};
System.out.println(message);
}
}快速检查
在包含多条语句的 switch 表达式分支中,哪个关键字会提供最终结果值?
回顾
您学习了 yield 关键字:
yield会从代码块分支产生一个值- 它类似于
return,但只适用于switch分支 - 可以自由混合使用箭头分支和代码块分支
- 代码块中的每条代码路径都必须执行
yield - 只有在需要额外语句时才使用代码块
常见问题解答
「yield 关键字」课时是免费的吗?
是的 — 「yield 关键字」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。
「yield 关键字」这节课中我会学到什么?
从 switch 代码块生成值 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Java Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「yield 关键字」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Java Academy 课中编写并运行代码吗?
能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 箭头式 switch
- 将 switch 用作表达式
- yield 关键字
- 多标签 case