
- はじめに
- 動機
- Sequenced の追加
- SequencedCollection
- SequencedSet
- SequencedMap
- Collections.unmodifiableSequenced
はじめに
Java21 でコレクションフレームワークに順序付き要素のシーケンスを表すインターフェースが追加されます。
JEP 内容のポイントまとめです。
動機
コレクションフレームワークには、並び(encounter order)が規定された要素のシーケンスを表す型が不足している。
例えば、以下の様に。
ListとDequeは要素の順序性が保証されるが、共通のスーパータイプはCollectionであり、これには並びの定義は含まれないSortedSetやLinkedHashSetは並びの定義が成されるが、Setには並びの定義は含まれないLinkedHashSetをCollections::unmodifiableSetでラップすると、並びの定義の情報が失われる
並びを定義するシーケンス型がないため、最初の要素の取得/最後の要素の取得などの操作が各コレクションの独自実装となっており、一貫性が欠落している。
Sequenced の追加
以下の型を追加する。
SequencedCollectionSequencedSetSequencedMap
これに伴い、コレクションフレームワークの型階層を以下のように変更する。

SequencedCollection
要素が 定義された順序を持つコレクション。
SequencedCollection には最初と最後の要素があり、それらの間の要素は、「前の要素」と「後ろの要素」を持つ。
どちらの端でも共通の操作をサポートし、要素を最初から最後、最後から最初に処理することをサポートする。
interface SequencedCollection<E> extends Collection<E> { // new method SequencedCollection<E> reversed(); // methods promoted from Deque void addFirst(E); void addLast(E); E getFirst(); E getLast(); E removeFirst(); E removeLast(); }
新しい reversed() メソッドは、元のコレクションを逆順に並べたビューを提供する(許可されている場合、ビューへの変更は元のコレクションに書き込まれる)。
例えば、LinkedHashSet から逆順のストリームを取得することは非常に困難であったが、以下のように簡略化される。
linkedHashSet.reversed().stream()
SequencedSet
シーケンスセットとは、重複する要素を含まない SequencedCollection の Set。
interface SequencedSet<E> extends Set<E>, SequencedCollection<E> { SequencedSet<E> reversed(); // covariant override }
SortedSet のように相対比較で要素を配置するコレクションは、addFirst(E) や addLast(E) のような明示的な配置操作をサポートできないため、UnsupportedOperationException をスローすることがある。
SequencedMap
エントリーが定義された順序を持つマップ。
interface SequencedMap<K,V> extends Map<K,V> { // new methods SequencedMap<K,V> reversed(); SequencedSet<K> sequencedKeySet(); SequencedCollection<V> sequencedValues(); SequencedSet<Entry<K,V>> sequencedEntrySet(); V putFirst(K, V); V putLast(K, V); // methods promoted from NavigableMap Entry<K, V> firstEntry(); Entry<K, V> lastEntry(); Entry<K, V> pollFirstEntry(); Entry<K, V> pollLastEntry(); }
新しい put*(K, V) は、特殊なケースのセマンティクスを持つ。
LinkedHashMap のようなマップでは、エントリーがすでにマップに存在する場合、そのエントリーを再配置するという追加の効果があり、SortedMap などのマップでは、これらのメソッドは UnsupportedOperationException をスローする。
Collections.unmodifiableSequenced
Collectionsユーティリティクラスに、3つの新しいタイプ向けの unmodifiable ラッパーを追加する。
Collections.unmodifiableSequencedCollection(collection)Collections.unmodifiableSequencedSet(sequencedSet)Collections.unmodifiableSequencedMap(sequencedMap)
![【 COFO Chair Pro 】[国内リラクゼーションブランド発 オフィスチェア ]最大135度リクライニング デスクチェア 腰全体を安定して支える可動式ランバーサポート パソコン フットレスト付き ワーク ゲーム 【 COFO Chair Pro 】[国内リラクゼーションブランド発 オフィスチェア ]最大135度リクライニング デスクチェア 腰全体を安定して支える可動式ランバーサポート パソコン フットレスト付き ワーク ゲーム](https://m.media-amazon.com/images/I/41fXh5D69OL._SL500_.jpg)