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;
}
});
¹ yield
是 not a keyword,正如用户 skomisa 所指出的那样。
我在 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;
}
});
¹ yield
是 not a keyword,正如用户 skomisa 所指出的那样。