加入有序集合,Java 集合框架变得更加完善

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/

本文文字及图片出自 InfoQ

余下全文(1/3)
分享这篇文章:

请关注我们:

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注