在封闭的开关表达式之外返回

时间:2019-06-28 12:24:26

标签: java switch-statement java-12 java-13

我正在Java 12中使用开关表达式¹将字符串转换为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;
              }
          });
}

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

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

  

返回到封闭的开关表达式之外

我如何编译它?


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

enum RequestMethod {GET, PUT, POST, HEAD}

¹switch expressions是Java 12中的预览功能。

1 个答案:

答案 0 :(得分:10)

在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中,开关表达式使用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;
            }
        });