1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

レコード型のパターンマッチングはwhileでも利用できる

Posted at

最近ふと思ったのですが、知ってみると当たり前のことでも、実際に気づくと感動することがあります。今回は、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
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?