Pattern Matchingの概要
Pattern Matching for switchは、Java 21 で正式リリースされた新しい機能です。
Pattern Matchingを使用することで、値の型や構造をパターンで表現して、そのパターンに一致するかどうかを判別することができます。
Pattern Matchingの特徴は以下になります。
- 型の安全性を保障できる
Pattern Matchingは、case文の条件式に型を指定することができます。
そのため、型の安全性を保障することができます。
- ANDやORを条件式として使用できる
Switch文では、条件式を使用できませんでした。
しかし、Pattern Matchingでは、IF文と同じくcase文に条件式を記述することができ、より複雑なcase文を記述することができます。
- nullを判別できる
case文でnullの判別をすることができます。
これまでSwitch文でnullを扱う場合、defaultを使用しなければいけませんでした。
しかし、Pattern Matchingでは、nullをcase文で使用することができます。
これにより、コードの可読性や品質を向上させることができます。
Pattern Matchingの使い方
記述方法
Pattern Matchingの記述方法は、Switch文と似ていますが、case文のあとに記述する[パターン]の部分が大きく異なります。
それでは、Pattern Matchingの記述方法を確認していきます。
Object a = switch (式) {
case [パターン1] -> // パターン1に一致した場合の処理
case [パターン2] -> // パターン2に一致した場合の処理
...
default -> // すべてのパターンに一致しなかった場合の処理
};
Switch文と同じく、(式)に一致するcase文の内容を実行します。
全て一致しなかった場合、defaultの内容を実行します。
先の説明の通り、Switch文の記述方法と殆ど同じになります。
大きくSwitch文と異なる[パターン]の例については、以下に記載するため、是非参考にしてください。
Pattern Matchingの例
型パターン
Object str = "Hello Java";
Object value = switch (str) {
case Integer i -> String.format("%d はintです", i);
case Long l -> String.format("%dはlongです", l);
case Double d -> String.format("%fはdoubleです", d);
case String s -> String.format("%sはStringです", s);
default -> String.format("一致なし");
};
System.out.println(value);
Hello JavaはStringです
例は、strの型をチェックするプログラムになります。
注意すべき点は、(式)の型とcase文に記述する型は、同じクラスまたは、どちらかのサブクラスにする必要があります。
それ以外の場合、コンパイルエラーになります。
ガードパターン
Integer month = 10;
String season = switch (month) {
case Integer sp when sp >= 3 && sp <= 5 -> String.format("%d月は春です", sp);
case Integer su when su >= 6 && su <= 8 -> String.format("%d月は夏です", su);
case Integer au when au >= 9 && au <= 11 -> String.format("%d月は秋です", au);
case Integer wi when wi == 12 || wi == 1 || wi == 2 -> String.format("%dは冬です", wi);
default -> String.format("月が正しくありません");
};
System.out.println(season);
10月は秋です
例は、case文に複数の条件式を記述するプログラムになります。。
注意すべき点は、条件式を記述する場合、whenを先に書く必要があります。
whenよりも先に条件式を書くとコンパイルエラーが発生します。
また、whenの記述はJava19からになります。
それ以前のJavaを使用している場合、whenの代わりに「&&」を使用することに注意して下さい。
null値の処理
String nullCheck = null;
String nullResult = switch (nullCheck) {
case null -> String.format("値がnullです");
case String n -> String.format("%sはStringです", n);
};
System.out.println(nullResult);
値がnullです
例は、nullCheckがnull値かをチェックするプログラムになります。
注意すべき点は、本プログラムにdefualt文を記述することができないことです。
defualt文を記述するとコンパイルエラーになります。
コンパイルエラーになる理由は、(式)の型とcase文に記述された条件文なしの型が一致している場合、必ずそのcase文が実行されるからです。
因みに、本プログラムでnullのcase文を記述していない場合、NullPointerExceptionになります。
また、defualtに関しては、以下の記述が可能です。
Object value = switch (str) {
case String s -> String.format("%sはStringです", s);
case null, default -> String.format("一致なし");
};
nullとdefualt文は、併用可能になります。
注意すべき点は、「case null, default」という順番で記述しなければなりません。
「case default, null」という順番の場合、コンパイルエラーになります。
まとめ
Pattern MatchingやSwitch Expressionsなど、ここ最近でSwitch文に関する大幅な変更が入りました。
可読性の向上や記述の手間が減った半面、プログラマーとしては慣れるのが非常に大変です。
しかし、今後プログラマーとして飯を食べていくには、これくらいで挫けるわけにはいきません。
プログラマーの皆さん、一緒に頑張っていきましょう!!
今回のブログが役に立った方、ブログへのアドバイスを頂ける方、また新しいJavaの情報などがありましたら、ぜひコメントをお願いします。
ここまで読んで頂き、ありがとうございました。
コメント