JEP 431(有序集合)已从 Candidate 状态进入到 Proposed to Target 状态(发布目标版本为 JDK 21)。这个 JEP 建议引入“一系列新的集合接口,这些集合的元素按照指定的序列或挨次摆列,并作为集合的结构属性。”其背后的动机是希望 Java 的集合框架能够提供定义良好的挨次和统一的操作。
一直以来,Java 的集合框架都需要一种集合类型可以表示指定挨次的元素序列和应用于这些集合的统一操作。不幸的是,对挨次的支持目前分散在集合框架的类层次结构中,这使得通过 API 来表达某些实际的概念变得较为困难。对此,有人提议引入新的接口来表示具有指定挨次的集合,并提供统一的 API 来拜候它们的第一个和最后一个元素,可以按照相反的挨次处理它们。
缺少这种集合类型来表示具有指定挨次的元素序列一直是各种问题和抱怨的主要来源。例如,虽然 List 和 Deque 定义了挨次,但它们的公共超类是 Collection,Collection 并没有定义挨次。类似地,Set 没有定义挨次,子类型(如 HashSet)也没有,但其他子类型(如 SortedSet 和 LinkedHashSet)有。
为了解决这个问题,新 JEP 为有序集合(Collection)、有序集(Set)和有序映射(Map)定义了新的接口,然后将其嵌入到现有的集合类结构中。这些接口中声明的所有新方法都有默认实现。有序集合、有序集和有序映射都具有不同的特征,有序集合表示元素具有指定挨次的集合,有序集表示不包含重复元素的集合,有序映射表示其条目具有指定挨次的映射。
新的 reversed()方法提供了原始集合的反向挨次视图,支持所有不同类型的排序,可以使用所有常用的迭代机制(如增强的 for 循环、显式 iterator()循环、forEach()、stream()、parallelStream()和 toArray())在两个标的目的上处理元素。
SequencedCollection 接口包罗几个新的方法,如下所示:
interface SequencedCollection<E> extends Collection<E> { // 新方法 SequencedCollection<E> reversed(); // 从Deque抽象上来的方法 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> { // 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(); }
这三个新接口都刚好融入到现有的集合类型结构中,List 将 SequencedCollection 作为其直接的父接口,Deque 也将 SequencedCollection 作为其直接的父接口,LinkedHashSet 实现了 SequencedSet,SortedSet 将 SequencedSet 作为其直接的父接口,LinkedHashMap 实现了 SequencedMap,SortedMap 将 SequencedMap 作为其直接的父接口。
显式排位 API(如 SortedSet::addFirst 和 SortedMap::putLast)会抛出 UnsupportedOperationException(因为它们的元素序列是通过比力来决定的),这些不实现所有 SequencedCollection 操作的不合错误称集合是有意义的,因为它将 SortedSet 和 SortedMap 也带入了有序集百口族,这样它们就可以得到更广泛的使用。
总的来说,引入新的接口来表示具有指定挨次的集合和应用于这些集合的统一操作,是 Java 集合框架向前迈出的重要一步。通过以一致且易于使用的方式提供对挨次的支持,集合框架对开发人员来说将变得更加直观和高效。
原文链接:
https://www.infoq.com/news/2023/03/collections-framework-makeover/
未经允许不得转载:迪欧吧_技术交流_资源分享_热点资讯_免费VPS空间 » 加入有序集合,Java 集合框架变得更加完善 – 程序师-迪欧吧