12

我在 Java 12 中使用 switch 表达式¹将字符串转换为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(然后将其包装在 Optional 中)。

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

在封闭的 switch 表达式之外返回

我如何让它编译?


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

enum RequestMethod {GET, PUT, POST, HEAD}

¹开关表达式是在 Java 12 中作为预览功能引入的。

4

1 回答 1

26

yield在 Java 13 中使用

在 Java 13 中,switch 表达式使用新的受限标识符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;
            }
        });

break在 Java 12 中使用

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

¹yield不是关键字,正如用户 skomisa 有用地指出的那样。

于 2019-06-28T12:24:26.177 回答