fuera retorno de expresión switch encerrando

Matthias Braun:

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 RequestMethodenumeración:

enum RequestMethod {GET, PUT, POST, HEAD}

¹ expresiones de conmutación se introdujeron en Java 12 como una función de vista previa.

Matthias Braun:

utilizar yielden Java 13

En Java 13, expresiones de conmutación utilizan las nuevas identifier¹ restringidas yieldpara 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 breaken Java 12

En Java 12, expresiones de conmutación utilizan breakpara 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;
            }
        });

yieldes no una palabra clave , como se ha señalado amablemente por skomisa usuario.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=226149&siteId=1
Recomendado
Clasificación