繰り返しは学習の母です。Java のswitchキーワードについてはすでに説明しましたが、今日は基本を確認し、いくつかの新しい情報を掘り下げていきます。

Java には、switch ステートメントと switch 式という2 種類のswitch構造があります。switch 式は、バージョン 12 と 13 の 2 つの非公式「プレビュー」バリアントに存在していましたが、Java 14 で正式になりました。

しかし、最初から始めましょう。バージョン 12 より前の古き良きスイッチがどのようなものか思い出してみましょう。

public String getProductTypeByName(String product) {
    String productType = "";

    switch (product) {
        case "Apple":
            productType = "Fruit";
            break;

        case "Peach":
            productType = "Fruit";
            break;

        case "Raspberry":
            productType = "Berry";
            break;

        case "Cherry":
            productType = "Berry";
            break;

        case "Tomato":
            productType = "Vegetable";
            break;

        default:
            productType = "other";
            break;
    }

    return productType;
}

switch ステートメントは、次々に実行される一連の構成要素です。値を返すことはできません。switch ステートメントを使用する場合の主な問題は、 case式を無限に追加できることですが、この機能はプログラマによって悪用されることがよくあります。

Java 12 では、実験的な機能が追加されました。新しいバージョンの switch (switch ステートメントではなく switch 式) は、値を生成し、内部で関数型プログラミングを使用し、共通の値を持つ case ステートメントをマージすることができます。コンパクトに構築します。

Java 12 では、getProductTypeByName()メソッドを次のように書き換えることができます。

public String getProductTypeByName(String product) {
    return switch (product) {
        case "Apple", "Peach" -> "Fruit";
        case "Raspberry", "Cherry" -> "Berry";
        case "Tomato" -> "Vegetable";
        default -> "other";

    };
}

コードがすっきりしました。関数型プログラミングの矢印構文を使用すると、 breakキーワードなしで値を返すことができ、一般に、スイッチの実行結果を変数に保存したり、 returnキーワードを介して返すことができるようになりました。

結果を返すだけでなく、複数行のコードも必要な場合、スイッチはのようになります。

public String getProductTypeByName(String product) {
    var result = switch (product) {
        case "Apple", "Peach" -> {
            System.out.println("This is a Fruit");
            break "Fruit";
        }
        case "Raspberry", "Cherry" -> {
            System.out.println("This is a Berry");
            break "Berry";
        }
        case "Tomato" -> {
            System.out.println("This is a Vegetable");
            break "Vegetable";
        }
        default -> {
            break "other";
        }

    };
     return result;
}

Java 13 では、switch 式はまだ実験的な機能でした。これを使用できるようにするには、Java 12 と同様に、コンパイルおよび実行時に--enable-previewコマンドを使用する必要があります。Java 13 のスイッチの主な、そして本質的に唯一の「革新」は、Breakに置き換わったyieldキーワードです。

public String getProductTypeByName(String product) {
    var result = switch (product) {
        case "Apple", "Peach" -> {
            System.out.println("This is a Fruit");
            yield "Fruit";
        }
        case "Raspberry", "Cherry" -> {
            System.out.println("This is a Berry");
            yield "Berry";
        }
        case "Tomato" -> {
            System.out.println("This is a Vegetable");
            yield "Vegetables";
        }
        default -> {
            System.out.println("Other");
            yield "other";
        }

    };
    return result;
}

yieldBreakの主な違いは、break はcaseステートメントから実行制御を返しますが、yield は内部returnステートメントのように動作してswitch全体の結果を返すことです。

Java 14 では、instanceof演算子が変更され、次のように使用できるようになりました。

if (o instanceof String s) {
s.toLowerCase();
}

これは、 instanceof を使用して変数をチェックするだけでなく、それを特定の型にキャストする必要があった、いささか醜い古い方法の代わりに使用されます。

if(s instanceof String) {
((String) s).toLowerCase();
}

これらの変更は、Java にパターン マッチングのサポートを追加することを目的とした Amber プロジェクトの一部です。

バージョン 14 でのinstanceof演算子の変更とバージョン 16 での拡張機能のおかげで、パターン マッチングは結局バージョン 17 に採用されました。確かに、現時点ではプレビューとしてのみ存在します。--enable-previewを使用して試すことができます。

public String getObjectType(Object object) {
    return switch (object) {
        case Integer i -> "Integer";
        case Long l -> "Long";
        case String s -> "String";
        default -> object.toString();
    };
}

一般に、新しいバージョンが登場するたびに、その言語にはますます興味深い機能が追加され、Java 開発がさらにクールになります。