パターンマッチング
CoddyのJavaジャーニー「ロジックとフロー」セクションの一部。レッスン 37/59。
Javaのパターンマッチングを使うと、オブジェクトが特定の型かどうかをテストし、そこから構成要素を取り出せます。型チェックやキャストの処理が簡単になります。
instanceof を使ったパターンマッチングの使い方を見てみましょう:
Object obj = "Hello";
if (obj instanceof String str) {
// str は自動的に String にキャストされる
System.out.println(str.toUpperCase());
}上記のコードを実行すると、出力は次のようになります。
"HELLO"
else ifを使ってパターンマッチングのチェックを連鎖させることもできます。
Object value = 42;
String result;
if (value instanceof Integer i) {
result = "Number: " + i;
} else if (value instanceof String s) {
result = "Text: " + s;
} else {
result = "Unknown";
}上記のコードを実行すると、resultには次の内容が格納されます。
“Number: 42”
チャレンジ
簡単processValueという名前のメソッドを作成し、次の1つの引数を受け取るようにします。
- 異なる型を取りうるObject(
value)
このメソッドでは、instanceofを使ったパターンマッチングで値を処理し、次のルールに基づいて文字列を返します。
- Integerの場合:"Number: "に値を2倍したものを続けて返す
- Stringの場合:"Text: "に値を大文字にしたものを続けて返す
- Booleanの場合:"Boolean: "に反対の値(trueはfalseに、falseはtrueに)を続けて返す
- その他の型の場合:"Unknown"を返す
自分で試してみよう
import java.util.Scanner;
public class Main {
public static String processValue(Object value) {
// TODO: instanceofを使ったパターンマッチングで値を処理する
// Integerの場合: "Number: " + (value * 2)を返す
// Stringの場合: "Text: " + value.toUpperCase()を返す
// Booleanの場合: "Boolean: " + (!value)を返す
// その他の型の場合: "Unknown"を返す
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String type = scanner.nextLine();
String inputValue = scanner.nextLine();
Object value = switch(type) {
case "Integer" -> Integer.parseInt(inputValue);
case "String" -> inputValue;
case "Boolean" -> Boolean.parseBoolean(inputValue);
default -> inputValue;
};
System.out.println(processValue(value));
}
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: Javaオンラインコンパイラ