😺
【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("不明な果物です");
}
}
}
Udemyで講座を公開中!
X(旧Twitter)
Zenn 本
Youtube
Discussion