Estoy usando un interruptor de expression¹ en Java 12 para convertir una cadena a un método 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;
}
});
}
Me gustaría advertir sobre el método no soportado en la rama defecto y retorno nulo (que se envuelve entonces en un Opcional).
Pero el código anterior provoca un error de compilación:
fuera retorno de expresión switch encerrando
¿Cómo llego al compilar?
Para completar, aquí está la definición de la RequestMethod
enumeración:
enum RequestMethod {GET, PUT, POST, HEAD}
¹ expresiones de conmutación se introdujeron en Java 12 como una función de vista previa.
utilizar yield
en Java 13
En Java 13, expresiones de conmutación utilizan las nuevas identifier¹ restringidas yield
para devolver un valor de un bloque:
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;
}
});
utilizar break
en Java 12
En Java 12, expresiones de conmutación utilizan break
para devolver un valor de un bloque:
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
es no una palabra clave , como se ha señalado amablemente por skomisa usuario.