我正在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中的预览功能。
答案 0 :(得分:10)
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;
}
});
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;
}
});