【Java】Pattern Matching for switchでコードを簡潔に記述する

スポンサーリンク

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の情報などがありましたら、ぜひコメントをお願いします。

ここまで読んで頂き、ありがとうございました。

Java基本
はじめまして
blueze

企業でアプリ開発をしているJavaプログラマーです。
当ブログでは、Javaを中心にIT系の発信をしています。
取得資格:Java Gold、AWS CLF、教育免許
趣味:将棋、野球、ゲーム

bluezeをフォローする
bluezeをフォローする
一緒に学ぶエンジニア

コメント

タイトルとURLをコピーしました