繁体   English   中英

Java 13 中的新关键字“yield”是什么意思?

[英]What does the new keyword "yield" mean in Java 13?

Java 13 引入了switch表达式的yield关键字。

我如何使用它,与默认return值或break值有什么区别?

问答

我该如何使用它?

  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; } };
  2. 使用传统块:

     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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM