JEP 431: 序列化集合
JEP 431(序列化集合)已从候选状态提升为目标提案状态,计划在JDK 21中引入。该提案旨在为Java集合框架引入一组新的接口,用于表示具有明确定义顺序的集合,并提供统一的操作方法。
背景与动机
Java的集合框架长期以来缺乏一种能够明确表示元素顺序的集合类型,导致在实际开发中难以表达某些概念。虽然List和Deque定义了元素顺序,但它们的共同超类型Collection并未定义顺序。类似地,Set也未指定顺序,尽管其子类型如SortedSet和LinkedHashSet定义了顺序。
新接口的引入
为了解决这一问题,提案引入了以下新接口:
- SequencedCollection:表示具有明确顺序的集合。
- SequencedSet:表示无重复元素的序列化集合。
- SequencedMap:表示具有明确顺序的映射。
这些接口通过默认方法提供了统一的API,允许开发者访问集合的第一个和最后一个元素,并支持反向处理元素。
主要方法
SequencedCollection接口新增了以下方法:
interface SequencedCollection<E> extends Collection<E> { SequencedCollection<E> reversed(); // 返回反向视图 void addFirst(E); // 添加元素到开头 void addLast(E); // 添加元素到末尾 E getFirst(); // 获取第一个元素 E getLast(); // 获取最后一个元素 E removeFirst(); // 移除第一个元素 E removeLast(); // 移除最后一个元素 }- SequencedSet接口继承了
SequencedCollection的所有方法,并增加了reversed()方法。 SequencedMap接口新增了以下方法:
interface SequencedMap<K,V> extends Map<K,V> { SequencedMap<K,V> reversed(); // 返回反向视图 SequencedSet<K> sequencedKeySet(); // 返回有序的键集合 SequencedCollection<V> sequencedValues(); // 返回有序的值集合 SequencedSet<Entry<K,V>> sequencedEntrySet(); // 返回有序的键值对集合 V putFirst(K, V); // 添加键值对到开头 V putLast(K, V); // 添加键值对到末尾 Entry<K, V> firstEntry(); // 获取第一个键值对 Entry<K, V> lastEntry(); // 获取最后一个键值对 Entry<K, V> pollFirstEntry(); // 移除并返回第一个键值对 Entry<K, V> pollLastEntry(); // 移除并返回最后一个键值对 }
接口集成
新接口与现有集合类型层次结构无缝集成:
List的直接超接口为SequencedCollection。Deque的直接超接口为SequencedCollection。LinkedHashSet实现SequencedSet。SortedSet的直接超接口为SequencedSet。LinkedHashMap实现SequencedMap。SortedMap的直接超接口为SequencedMap。
特殊处理
对于SortedSet和SortedMap,由于元素的顺序由相对比较决定,因此addFirst和putLast等显式定位方法会抛出UnsupportedOperationException。尽管如此,这种不对称性使得SortedSet和SortedMap能够被更广泛地使用。
总结
引入序列化集合接口是Java集合框架的重要进步。通过以一致且易于使用的方式支持元素顺序,框架将变得更加直观和高效,帮助开发者更轻松地处理有序集合。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。