返回封闭开关表达式之外在 Java 13 中使用yield在 Java 12 中使用break

2022-09-03 18:14:13

我在Java 12中使用了一个开关表达式¹,将字符串转换为HTTP方法

static Optional<RequestMethod> parseRequestMethod(String methodStr) {
    return Optional.ofNullable(
          switch (methodStr.strip().toUpperCase(Locale.ROOT)) {
              case "GET" -> RequestMethod.GET;
              case "PUT" -> RequestMethod.PUT;
              case "POST" -> RequestMethod.POST;
              case "HEAD" -> RequestMethod.HEAD;

              default -> {
                  log.warn("Unsupported request method: '{}'", methodStr);
                  return null;
              }
          });
}

我想警告默认分支中不受支持的方法并返回null(然后将其包装在Anodset中)。

但上面的代码会导致编译器错误:

返回封闭开关表达式之外

如何编译它?


为了完整起见,以下是枚举的定义:RequestMethod

enum RequestMethod {GET, PUT, POST, HEAD}

¹ switch 表达式作为预览功能在 Java 12 中引入。


答案 1

在 Java 13 中使用yield

在 Java 13 中,开关表达式使用新的受限标识符¹ 从块返回值:yield

return Optional.ofNullable(
        switch (methodStr.strip().toUpperCase(Locale.ROOT)) {
            case "GET" -> RequestMethod.GET;
            // ... rest omitted

            default -> {
                log.warn("Unsupported request method: '{}'", methodStr);
                // yield instead of return
                yield null;
            }
        });

在 Java 12 中使用break

在 Java 12 中,switch 表达式用于从块返回值:break

return Optional.ofNullable(
        switch (methodStr.strip().toUpperCase(Locale.ROOT)) {
            case "GET" -> RequestMethod.GET;
            // ... rest omitted

            default -> {
                log.warn("Unsupported request method: '{}'", methodStr);
                // break instead of return
                break null;
            }
        });

¹ 产量不是关键字,正如用户 skomisa 所指出的那样。


答案 2