12

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 を返したいと思います (その後、オプションでラップされます)。

しかし、上記のコードではコンパイラ エラーが発生します。

囲んでいる switch 式の外側に戻る

これをコンパイルするにはどうすればよいですか?


RequestMethod完全を期すために、列挙型の定義を次に示します。

enum RequestMethod {GET, PUT, POST, HEAD}

¹スイッチ式は、Java 12 でプレビュー機能として導入されました。

4

1 に答える 1

26

yieldJava 13で使用

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;
            }
        });

breakJava 12で使用

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;
            }
        });

¹yieldキーワードではありません。

于 2019-06-28T12:24:26.177 に答える