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

新手上路,请多包涵

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

我如何使用它以及默认值 returnbreak 值有什么区别?

原文由 zerocewl 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.7k
2 个回答

问答

我该如何使用它?

  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;
       }
   };

  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 语句试图将控制转移到最里面的封闭开关表达式;这个称为 yield target 的 表达式立即正常完成,并且 Expression 的值变为 switch 表达式的值。

  • 如果 yield 语句没有 yield 目标,则会出现编译时错误。

  • 如果 yield 目标包含包含 yield 语句的任何方法、构造函数、初始值设定项或 lambda 表达式,则会出现编译时错误。

  • 如果 Expression yield 无效 (15.1),则为编译时错误。

执行 yield 语句首先评估 Expression 。如果 Expression 的评估由于某种原因突然完成,那么 yield 语句也因此突然完成。 If evaluation of the Expression completes normally, producing a value V , then the yield statement completes abruptly, the reason being a yield with value V

原文由 Andrew Tobilko 发布,翻译遵循 CC BY-SA 4.0 许可协议

作为 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 上使用 break 返回值的 JEP 325 感到困惑:

我们扩展了 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 引入并改进了 switch 表达式,但它们是作为预览语言功能进行的。这意味着 (a) 它仍然可以在接下来的几个版本中改变(就像它在 12 到 13 之间所做的那样)和 (b) 它需要在编译时和运行时使用新的命令行选项 –enable- 解锁预习。然后 请记住,这不是 switch 的最终结果——它只是通向完整模式匹配的一步。

原文由 user7294900 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题