Java - スイッチ式

こんにちは、未来のJavaプログラマーの皆さん!今日は、Java 12で導入され、Java 14で改良された最も魅力的な機能の一つであるスイッチ式について深く掘り下げていきます。あなたの親しみのある近所のコンピュータサイエンスの先生として、コードを一行も書かないことがあるだろうとしても、この旅を案内してあげることができます。だから、シートベルトを締めて、始めましょう!

Java - Switch Expressions

スイッチ式とは?

スイッチ式に飛び込む前に、まずスイッチ文について簡単に説明しましょう。アイスクリームパーラーにいて、選んだ味によって異なるトッピングを得ると想象してみてください。それはプログラミングでのスイッチ文の基本的な役割と非常に似ています。異なる条件に基づいて異なるコードを実行することができます。

さて、スイッチ式はこのコンセプトをさらに強化し、より簡潔にします。スイッチブロック全体を式として扱い、値を返すことができるようになります。それは普通のアイスクリームコーンからデリシャスサンデーにアップグレードするようなものです!

古い方法:従来のスイッチ文

まず、従来のスイッチ文を使ってどのようにしていたかを見てみましょう:

String day = "MONDAY";
String typeOfDay;

switch (day) {
case "MONDAY":
case "TUESDAY":
case "WEDNESDAY":
case "THURSDAY":
case "FRIDAY":
typeOfDay = "Weekday";
break;
case "SATURDAY":
case "SUNDAY":
typeOfDay = "Weekend";
break;
default:
typeOfDay = "Invalid day";
}

System.out.println(typeOfDay);

この例では、日が週末か週末かを決定しています。break文を使ってフォールスルーを防ぐ必要があり、typeOfDayをスイッチブロックの外で宣言する必要があることに注意してください。

新しい方法:スイッチ式

では、同じ結果をスイッチ式を使ってどのように達成できるかを見てみましょう:

String day = "MONDAY";
String typeOfDay = switch (day) {
case "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY" -> "Weekday";
case "SATURDAY", "SUNDAY" -> "Weekend";
default -> "Invalid day";
};

System.out.println(typeOfDay);

わお!どれだけクリーンアップされ、より簡潔になったかを見てください。複数のケースを組み合わせ、break文を削除し、結果を直接typeOfDayに割り当てました。部屋の掃除をするのと同じです — 突然すべてが整然としています!

"case L ->" ラベルを使ったスイッチ式

矢印構文(->)はスイッチ式の主要な機能です。ケースラベルとその関連するアクションを簡潔に指定するための方法を提供します。別の例を見てみましょう:

int dayNumber = 3;
String dayName = switch (dayNumber) {
case 1 -> "Monday";
case 2 -> "Tuesday";
case 3 -> "Wednesday";
case 4 -> "Thursday";
case 5 -> "Friday";
case 6 -> "Saturday";
case 7 -> "Sunday";
default -> "Invalid day number";
};

System.out.println("Day " + dayNumber + " is " + dayName);

この例では、日付番号を対応する名前に変換しています。矢印構文により、各ケースが単一行で簡単に読めます。正しい答えに直接指すサインポストのようです!

"case L:" 文と yield 文を使ったスイッチ式

時々、スイッチ式内で単純な値を返すのではなく、もっと複雑な計算を行う必要があるかもしれません。そんなときに役立つのが yield 文です。"私の計算は終わりました、これが最終的な答えです!" と言うように。

例を見てみましょう:

int month = 8;
String season = switch (month) {
case 12, 1, 2:
yield "Winter";
case 3, 4, 5:
yield "Spring";
case 6, 7, 8:
yield "Summer";
case 9, 10, 11:
yield "Fall";
default: {
String message = "Invalid month: " + month;
System.out.println(message);
yield "Unknown";
}
};

System.out.println("The season for month " + month + " is " + season);

この例では、月によって季節を決定しています。yield を使って値を返すことに注意してください、特に default ケースでは少しもっと処理を行っています。

高度な使用:ケースラベル内の式

スイッチ式の最もクールな機能の一つは、ケースラベル内で式を使用できることです。それはスイッチ文に超能力を与えるようなものです!以下はその例です:

record Person(String name, int age) {}

Person person = new Person("Alice", 25);

String lifeStage = switch (person) {
case Person p when p.age() < 13 -> "Child";
case Person p when p.age() >= 13 && p.age() < 20 -> "Teenager";
case Person p when p.age() >= 20 && p.age() < 60 -> "Adult";
case Person p when p.age() >= 60 -> "Senior";
default -> "Unknown";
};

System.out.println(person.name() + " is a " + lifeStage);

この例では、record(他のクールなJava機能)を使って人を表現し、複雑な条件を持つスイッチ式を使ってその人生段階を決定しています。コードに個人的な人生コーチを持つようなものです!

結論

スイッチ式は、Javaでのコードをより読みやすく、簡潔に、そしてエラーを少なくするための強力なツールです。それはフリップホンからスマートフォンにアップグレードするようなものです — 突然、より少ない努力でさらに多くのことができるようになります!

覚えておきましょう、プログラミングはすべて実践です。だから、これらの概念を実験することを恐れずにしましょう。自分のスイッチ式を作成し、異なるシナリオで遊んでみて、最も重要なのは、それを楽しむことです!

最後に、今日話した主要な方法をまとめた表を以下に示します:

メソッド 説明
-> ケースラベルとアクションを簡潔に指定するための矢印構文
yield スイッチ式から値を返すための文
case L when condition ケースラベル内のパターンマッチング

お楽しみできるコーディングを!そして、スイッチが常に明確に表現できるように!

Credits: Image by storyset