パターンマッチング Java の switch 文で型ごとに異なる処理を行う

2024/04/01に公開

switch 文とは

switch 文を使うと if-else 文で書いた処理をスッキリしたものに書き換えることができる場合があります。例を見てみましょう。

if-else 文
public class Main {
    public static void main(String[] args) {
        String day = "SUN";
        String result = "";
        day = day.toUpperCase();
        if (day.equals("SUN")) {
            result = "日曜日";
        } else if (day.equals("MON")) {
            result = "月曜日";
        } else if (day.equals("TUE")) {
            result = "火曜日";
        } else if (day.equals("WED")) {
            result = "水曜日";
        } else if (day.equals("THU")) {
            result = "木曜日";
        } else if (day.equals("FRI")) {
            result = "金曜日";
        } else if (day.equals("SAT")) {
            result = "土曜日";
        } else {
            result = "不正な値です";
        }
        System.out.println(result); // 日曜日
    }
}
\downarrow\quad \downarrow\quad \downarrow
switch 文
public class Main {
    public static void main(String[] args) {
        String day = "SUN";
        String result = switch (day.toUpperCase()) {
            case "SUN" -> "日曜日";
            case "MON" -> "月曜日";
            case "TUE" -> "火曜日";
            case "WED" -> "水曜日";
            case "THU" -> "木曜日";
            case "FRI" -> "金曜日";
            case "SAT" -> "土曜日";
            default -> "不正な値です";
        };
        System.out.println(result); // 日曜日
    }
}

switch 式

先ほどのコードを switch 式で書くとよりスッキリします。

switch 式
public class Main {
    public static void main(String[] args) {
        String day = "SUN";
        System.out.println(switch (day.toUpperCase()) { // 日曜日
            case "SUN" -> "日曜日";
            case "MON" -> "月曜日";
            case "TUE" -> "火曜日";
            case "WED" -> "水曜日";
            case "THU" -> "木曜日";
            case "FRI" -> "金曜日";
            case "SAT" -> "土曜日";
            default -> "不正な値です";
        });
    }
}

型ごとに異なる処理を行う

関数型プログラミング言語にはパターンマッチングやパターンマッチと呼ばれる switch 文を強化した機能があります。 Java においても Java 21 から パターンマッチングが使えるようになり、具体的には case 句に型を指定できるようになりました。型ごとに異なる処理が行えるため、より複雑な処理が可能です。例を見てみましょう。

パターンマッチングの例
public class Main {
    public static void main(String[] args) {
        Object data = 4;
        System.out.println(switch (data) { // 4月
+           case String day -> switch (day.toUpperCase()) {
                case "SUN" -> "日曜日";
                case "MON" -> "月曜日";
                case "TUE" -> "火曜日";
                case "WED" -> "水曜日";
                case "THU" -> "木曜日";
                case "FRI" -> "金曜日";
                case "SAT" -> "土曜日";
                default -> "曜日を指定してください。";
            };
+           case Integer month -> switch (month) {
                case 1 -> "1月";
                case 2 -> "2月";
                case 3 -> "3月";
                case 4 -> "4月";
                case 5 -> "5月";
                case 6 -> "6月";
                case 7 -> "7月";
                case 8 -> "8月";
                case 9 -> "9月";
                case 10 -> "10月";
                case 11 -> "11月";
                case 12 -> "12月";
                default -> "月を指定してください。";
            };
            default -> "意図しない型です。";
        });
    }
}

when 節を使う

先ほどのコードで後半部分にある、数字を月に変換する部分はもう少し工夫ができそうです。 month + "月" のように処理ができると嬉しいですね。ただし、 month の値が 13 のような場合には 13月 と表示してほしくありません。 month の値が 1 以上 12 以下の整数値であるといった条件の指定に when 節が使えます。以下にコードを示します。

パターンマッチングに when 節を使う
public class Main {
    public static void main(String[] args) {
        Object data = 12;
        System.out.println(switch (data) { // 12月
            case String day -> switch (day.toUpperCase()) {
                case "SUN" -> "日曜日";
                case "MON" -> "月曜日";
                case "TUE" -> "火曜日";
                case "WED" -> "水曜日";
                case "THU" -> "木曜日";
                case "FRI" -> "金曜日";
                case "SAT" -> "土曜日";
                default -> "曜日を指定してください。";
            };
+           case Integer month when 1 <= month && month <= 12 -> month + "月";
+           case Integer month -> "月を指定してください。";
            default -> "意図しない型です。";
        });
    }
}

Discussion