Return 在封闭的 switch 表达式之外

Return outside of enclosing switch expression

我在 Java 12 中使用 switch 表达式¹ 将字符串转换为 HTTP method:

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

我想警告默认分支中不受支持的方法和 return null(然后包装在可选中)。

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

Return outside of enclosing switch expression

如何编译它?


为了完整起见,这里是 RequestMethod 枚举的定义:

enum RequestMethod {GET, PUT, POST, HEAD}

¹ switch expressions 在 Java 12 中作为预览功能引入。

在Java13

中使用yield

在 Java 13 中,switch 表达式使用新的受限标识符¹ yield 到 return 来自块的值:

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

在Java12

中使用break

在Java12中,switch表达式使用break到return块中的一个值:

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

¹ yieldnot a keyword,正如用户 skomisa 所指出的那样。