1. 導入:なぜSequencedCollectionが必要なのか
Javaでプログラミングをしていると、List(順序あり)とSet(順序なし)の扱いに悩むことはありませんか?これまでは「先頭や末尾の要素を取り出す」といった単純な操作であっても、リストならget(0)、セットならイテレータを回すなど、実装クラスごとに書き方を変える必要がありました。Java 21で導入されたSequencedCollectionは、このバラバラだった順序付きコレクションの操作を統一し、直感的で美しいコードを書くための強力な武器となります。
2. 基礎知識:SequencedCollectionとは?
SequencedCollectionは、その名の通り「順序が定義されているコレクション」を扱うためのインターフェースです。これまで、ListやDeque(両端キュー)、LinkedHashSetなどは、それぞれ独立したインターフェースで管理されていました。
この新しいインターフェースにより、最初(First)と最後(Last)の要素へのアクセスや削除が、すべての順序付きコレクションで共通のメソッドとして使えるようになりました。これにより、コードの再利用性が高まり、可読性が劇的に向上します。
3. 実装/解決策:主なメソッドの使い方
SequencedCollectionが提供する主なメソッドは以下の通りです。
・addFirst(E e) / addLast(E e):先頭や末尾に要素を追加する
・getFirst() / getLast():先頭や末尾の要素を取得する
・removeFirst() / removeLast():先頭や末尾の要素を削除して取得する
・reversed():逆順のビュー(表示)を取得する
これまでは「LinkedHashSetの最後を取得する」だけでも工夫が必要でしたが、今後はこれらのメソッドを呼ぶだけで完結します。
4. サンプルプログラム
以下のコードをコピーして、Java 21以上の環境で実行してみてください。
import java.util.;
public class SequencedCollectionExample {
public static void main(String[] args) {
// LinkedHashSetは順序を保持するコレクションです
SequencedCollection<String> set = new LinkedHashSet<>();
// データの追加
set.addLast("Java");
set.addLast("Python");
set.addLast("JavaScript");
// 先頭と末尾の取得
System.out.println("最初: " + set.getFirst()); // Java
System.out.println("最後: " + set.getLast()); // JavaScript
// 逆順で処理する
System.out.print("逆順: ");
set.reversed().forEach(s -> System.out.print(s + " "));
System.out.println();
// 末尾の削除
set.removeLast();
System.out.println("削除後の最後: " + set.getLast()); // Python
}
}
5. 応用・注意点:現場で役立つポイント
注意点1:すべてのコレクションが対象ではない
HashSetやHashMapなど、そもそも順序を保証しないコレクションにはこのインターフェースは適用されません。必ず「順序が定義されていること」が前提となります。
注意点2:reversed()はコピーではない
reversed()メソッドはコレクションをコピーしているわけではなく、元のコレクションを逆から見るための「ビュー(View)」を返します。そのため、ビューに対して行った変更(要素の削除など)は、元のコレクションにも反映される点に注意してください。
現場では、特に「履歴の保持」や「最新のN件を表示する」といった実装において、このSequencedCollectionを使うことで、従来よりも簡潔でバグの少ないコードが書けるようになります。ぜひ活用してみてください。

コメント