😺

【Java】switch式について

に公開

従来のswitch文とは?

switch文は、ある値(例えば整数や文字)を比較し、それに応じた処理を行う制御構造
if文と似ていますが、分岐が多い場合にスッキリ書けるのが特徴

  • switch (変数) で判定する変数を指定。
  • caseに続けて比較する値を書く。
  • breakを入れないと、次のcaseまで実行されてしまう。
  • どのcase にも当てはまらない場合、defaultが実行される。

例)数値に応じたメッセージを表示する

package switchest;

public class SwitchExample {
    public static void main(String[] args) {
        int day = 3;  // 曜日(1: 月曜日, 2: 火曜日, ...)

        switch (day) {
            case 1:
                System.out.println("月曜日です");
                break;
            case 2:
                System.out.println("火曜日です");
                break;
            case 3:
                System.out.println("水曜日です");
                break;
            default:
                System.out.println("その他の曜日です");
                break;
        }
    }
}

<出力例>

breakがないと

package switchest;

public class SwitchTest {
	public static void main(String[] args) {
		int day = 3; // 曜日(1: 月曜日, 2: 火曜日, ...)

		switch (day) {
		case 1:
			System.out.println("月曜日です");
		case 2:
			System.out.println("火曜日です");
		case 3:
			System.out.println("水曜日です");
		default:
			System.out.println("その他の曜日です");
		}
	}
}

<出力例>

switch式とは?

java14以降では、switchが「式」として値を返せるようになった
これにより、breakが不要になり、switchの結果を直接変数に代入するということが出来るようになった

  • -> を使って、caseに対応する処理を記述。
  • switch式は値を返すので、そのまま変数に代入できる。
package switchest;

public class SwitchExpressionTest {
	public static void main(String[] args) {
		int day = 3;

		String message = switch (day) {
		//変数dayが1だったら「月曜日です」が変数messageに代入される
		case 1 -> "月曜日です";
		case 2 -> "火曜日です";
		case 3 -> "水曜日です";
		default -> "その他の曜日です";
		};

		System.out.println(message);
	}
}

<出力例>

switch式のブロックを使う方法

ブロックを使用して処理を記述することも可能

package switchest;

public class SwitchExpressionBlockTest {
	public static void main(String[] args) {
		int score = 20;

		String grade = switch (score / 10) {
		case 100, 90 -> "A";
		case 80 -> "B";
		case 70 -> "C";
		case 60 -> "D";
		default -> {
			System.out.println("追試です");
			//値を返したいときはyieldを記述
			yield "F";
		}
		};

		System.out.println("成績:" + grade + "ランク");
	}
}

defaultについて

従来の場合

例えば以下のコードの場合、defaultの記述がなくても何も表示されないだけだった

package switchest;

public class SwitchTest2 {
	public static void main(String[] args) {
		int day = 5;

		switch (day) {
		case 1:
			System.out.println("月曜日");
			break;
		case 2:
			System.out.println("火曜日");
			break;
		case 3:
			System.out.println("水曜日");
			break;
		}
	}
}

switch式の場合

default がないとコンパイルエラーになるケース

  • 変数dayに5が格納されているが、caseに記述がない

  • enumと合わせて使用することも出来るが、enumで定義されている「WEDNESDAY」に対応する記述がない

<上記の対応例1>

package switchest;
enum Day { MONDAY, TUESDAY, WEDNESDAY }

public class SwitchExpressionTest3 {
    public static void main(String[] args) {
        Day today = Day.TUESDAY;

        String message = switch (today) {
            case MONDAY -> "月曜日";
            case TUESDAY -> "火曜日";
            case WEDNESDAY -> "水曜日";
        };

        System.out.println(message);
    }
}

<上記の対応例2>

package switchest;
enum Day { MONDAY, TUESDAY, WEDNESDAY }

public class SwitchExpressionTest3 {
    public static void main(String[] args) {
        Day today = Day.TUESDAY;

        String message = switch (today) {
            case MONDAY -> "月曜日";
            case TUESDAY -> "火曜日";
            default -> "その他の曜日です";
        };

        System.out.println(message);
    }
}

その他の書き方の例

-> のあとに 1行の処理だけ書くときは、ブロック {} を省略できる

public class FruitSwitchExample {
    public static void main(String[] args) {
        String fruit = "apple";

        switch (fruit) {
           case "apple" -> System.out.println("リンゴです");
           case "banana" -> System.out.println("バナナです");
           default -> System.out.println("不明な果物です");
        }
    }
}

https://zenn.dev/codek2/articles/7fbfa22ba62e69

Udemyで講座を公開中!
https://zenn.dev/codek2/articles/e9e44f3e0023fb

X(旧Twitter)
https://twitter.com/kunchan2_

Zenn 本
https://zenn.dev/codek2?tab=books

Youtube
https://www.youtube.com/@codek2_studio

Discussion