猿问

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

我在 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(然后将其包装在 Optional 中)。


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


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


我如何让它编译?


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


enum RequestMethod {GET, PUT, POST, HEAD}

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



慕斯709654
浏览 158回答 1
1回答

千巷猫影

yield在 Java 13 中使用在 Java 13 中,switch 表达式使用新的受限标识符¹yield从块中返回值:return Optional.ofNullable(&nbsp; &nbsp; &nbsp; &nbsp; switch (methodStr.strip().toUpperCase(Locale.ROOT)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case "GET" -> RequestMethod.GET;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // ... rest omitted&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; default -> {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log.warn("Unsupported request method: '{}'", methodStr);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // yield instead of return&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; yield null;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; });break在 Java 12 中使用在 Java 12 中,switch 表达式用于break从块中返回值:return Optional.ofNullable(&nbsp; &nbsp; &nbsp; &nbsp; switch (methodStr.strip().toUpperCase(Locale.ROOT)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case "GET" -> RequestMethod.GET;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // ... rest omitted&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; default -> {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log.warn("Unsupported request method: '{}'", methodStr);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // break instead of return&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break null;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; });¹yield不是关键字,正如用户 skomisa 所指出的那样。
随时随地看视频慕课网APP

相关分类

Java
我要回答