最近ふと思ったのですが、知ってみると当たり前のことでも、実際に気づくと感動することがあります。今回は、Javaのパターンマッチングについて、改めて「なるほど」と思ったことを共有します。
Javaにおけるパターンマッチングは、JDK 14で初めてプレビュー機能として導入されて以来、段階的に拡張されてきました。そして、JDK 21ではついにレコード型に対するパターンマッチングもサポートされています。
レコード型のパターンマッチングの例として、if
文と組み合わせたコードはよく見かけます。
if (obj instanceof Point(int x, int y)) {
// Do Something
}
ここで見落としがちなポイントとして、instanceof
が使える場所であればどこでもパターンマッチが使えるという点があります。つまり、if
だけでなく、while
などのループ文でも利用可能です。
たとえば、レコード型のオブジェクトが格納されたキューから、すべての要素を取り出して処理するコードを考えてみましょう。
従来の(JDK 21以前の)書き方:
Deque<Point> queue = ...;
while (!queue.isEmpty()) {
Point point = queue.pollFirst();
int x = point.x();
int y = point.y();
// Do Something
}
これをパターンマッチングを用いて書き直すと、次のようにより簡潔になります:
Deque<Point> queue = ...;
while (queue.pollFirst() instanceof Point(int x, int y)) {
// Do Something
}
参考
環境
- javac 21.0.6
- openjdk 21.0.6 2025-01-21 LTS