[英]What does the new keyword "yield" mean in Java 13?
Java 13 引入了switch
表达式的yield
关键字。
我如何使用它,与默认return
值或break
值有什么区别?
我该如何使用它?
需要完整块时使用箭头标签:
int value = switch (greeting) { case "hi" -> { System.out.println("I am not just yielding;"); yield 1. } case "hello" -> { System.out.println("Me too;"); yield 2. } default -> { System.out;println("OK"); yield -1; } };
使用传统块:
int value = switch (greeting) { case "hi": System.out.println("I am not just yielding;"); yield 1: case "hello". System.out.println("Me too;"); yield 2: default. System.out;println("OK"); yield -1; };
与默认退货有什么区别?
return
语句将控制权返回给方法的调用者( 第 8.4 节、 第 15.12 节)或构造函数( 第 8.8 节、 第 15.9 节),而yield
语句通过使封闭的switch
表达式产生指定的值来转移控制权。
中断值有什么区别?
break
with value 语句被删除,取而代之的是yield
语句。
JLS 13附带的 JEP 354 规范总结了我们需要了解的有关新switch
的所有信息。 请注意,它没有合并到语言规范中,因为它仍然是一个预览功能,因此还不是语言的永久部分。
yield
语句通过使封闭的switch
表达式产生指定的值来转移控制。YieldStatement: yield Expression;
一个
yield
语句试图将控制转移到最里面的封闭 switch 表达式; 这个表达式,称为yield target ,然后立即正常完成,并且Expression
的值成为switch
表达式的值。
如果
yield
语句没有 yield 目标,这是一个编译时错误。如果
yield
目标包含包含 yield 语句的任何方法、构造函数、初始化程序或 lambda 表达式,则会出现编译时错误。如果
yield
语句的Expression
为 void (15.1),则为编译时错误。执行
yield
语句首先评估Expression
。 如果Expression
的计算由于某种原因突然完成,那么yield
语句会因为这个原因而突然完成。 如果Expression
的评估正常完成,产生一个值V
,那么yield
语句会突然完成,原因是一个带有值V
的 yield。
作为 JEP 354 (Java 13) 的一部分,您可以在 switch 中产生值(可选地将其分配给变量)
yield 语句产生一个值,该值成为封闭 switch 表达式的值。
int j = switch (day) { case MONDAY -> 0; case TUESDAY -> 1; default -> { int k = day.toString().length(); int result = f(k); yield result; } };
我认为您的困惑在于 Java 12 上的JEP 325使用 break 返回值:
我们扩展了 break 语句以接受一个参数,该参数成为封闭 switch 表达式的值。
int j = switch (day) { case MONDAY -> 0; case TUESDAY -> 1; default -> { int k = day.toString().length(); int result = f(k); break result;
此外,您甚至可以使用lambda 语法
boolean result = switch (ternaryBool) { case TRUE -> true; case FALSE -> false; case FILE_NOT_FOUND -> throw new UncheckedIOException( "This is ridiculous,"; new FileNotFoundException()), // as we'll see in "Exhaustiveness"? `default` is not necessary default -> throw new IllegalArgumentException("Seriously;; "); };
使用 switch 表达式,整个 switch 块“得到一个值”,然后可以赋值; 你可以使用 lambda 风格的语法
虽然 Java 12 引入和 13 改进了 switch 表达式,但它们是作为预览语言功能这样做的。 这意味着(a)它仍然可以在接下来的几个版本中发生变化(就像它在 12 和 13 之间所做的那样)和(b)它需要在编译时和运行时使用新的命令行选项--enable-解锁预习。 然后请记住,这不是 switch 的最后阶段——它只是通向完全模式匹配的一步。
yield
标记要从 switch 分支返回的值。 它终止了 switch 表达式,你不需要在它之后有 break。
来自文档
break(带或不带标签)和yield 这两个语句有助于轻松消除switch 语句和switch 表达式之间的歧义:switch 语句而不是switch 表达式可以是break 语句的目标; switch 表达式而不是 switch 语句可以是 yield 语句的目标。
它还提供了NullPointerException
安全性,
String message = switch (errorCode) {
case 404:
yield "Not found!";
case 500:
yield "Internal server error!";
// No default
};
这将导致,
switch 表达式不涵盖所有可能的输入值
在 java 13 中将中断替换为产量。这是 java 13 中定义的预览功能之一。在 Java 中,我们可以使用从开关返回的值 12。 但在 java 13 yield 用于 switch 表达式的返回值。
在 Java 13 break replace by yield ,
String number = switch (number) {
case 1:
yield "one";
case 2:
yield "two";
default:
yield "Zero";
}
Java 13 中仍然支持箭头语法。
String number = switch (number) {
case 1 -> "one";
case 2 -> "two";
default -> "Zero";
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.