Javaの拡張switchステートメントのメリット

switch文

Javaで従来から利用できるswitch-case文の形式は以下の通り。整数や文字列等が利用可能です。

public void func(int number) {
    switch (number) {
        case 0:
            System.out.println("0");
            break;
        case 1:
        case 2:
            System.out.println("1");
            System.out.println("2");
            break;
        default:
            System.out.println("-1");
            break;
    }
}

Java 17 LTSなら拡張switch文が使えます。IntelliJ等のIDEAを使えば、自動でソースコードを変換してくれます。default行は不要な場合は省略できます。

public void func(int number) {
    switch (number) {
        case 0 -> System.out.println("0");
        case 1, 2 -> {
            System.out.println("1");
            System.out.println("2");
        }
        default -> System.out.println("-1");
    }
}

考えうる全ての処理はcase句で行われ、defaultに来ることが無い場合は、例外をthrowしておくとプログラムの改修時にも安心です。

public void func(int number) {
    switch (number) {
        case 0 -> System.out.println("0");
        case 1, 2 -> {
            System.out.println("1");
            System.out.println("2");
        }
        default -> throw new IllegalArgumentException();
    }
}

switch式

switch式により粋なコードを書くこともできます。最後のセミコロンは必要です。

int ret = switch (number) {
    case 0 -> 0;
    case 1, 2 -> 1;
    default -> -1;
};

今まで通り、Stringやint等を混ぜることもできます。ブロック{}を利用する場合はyieldで返します。

int ret = switch (str) {
    case "0" -> {
        yield 0;
    }
    case "1", "2" -> 1;
    default -> -1;
};

拡張switchのメリット

拡張switch表現のメリットには、以下のようなものがあると言われています。

  • break文が不要になる
  • 複数一致をカンマ区切りでcaseに列挙できる
  • ソースコードを少し短くできる
  • switch式が使える
  • 表記がプログラマーにとって直感的になった?

ラムダ式の苦手意識も自然に解消しそうな便利さです。