Java的集合框架焕然一新,新增序列化集合类型

JEP 431: 序列化集合

JEP 431(序列化集合)已从候选状态提升为目标提案状态,计划在JDK 21中引入。该提案旨在为Java集合框架引入一组新的接口,用于表示具有明确定义顺序的集合,并提供统一的操作方法。

背景与动机

Java的集合框架长期以来缺乏一种能够明确表示元素顺序的集合类型,导致在实际开发中难以表达某些概念。虽然ListDeque定义了元素顺序,但它们的共同超类型Collection并未定义顺序。类似地,Set也未指定顺序,尽管其子类型如SortedSetLinkedHashSet定义了顺序。

新接口的引入

为了解决这一问题,提案引入了以下新接口:

  1. SequencedCollection:表示具有明确顺序的集合。
  2. SequencedSet:表示无重复元素的序列化集合。
  3. 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

特殊处理

对于SortedSetSortedMap,由于元素的顺序由相对比较决定,因此addFirstputLast等显式定位方法会抛出UnsupportedOperationException。尽管如此,这种不对称性使得SortedSetSortedMap能够被更广泛地使用。

总结

引入序列化集合接口是Java集合框架的重要进步。通过以一致且易于使用的方式支持元素顺序,框架将变得更加直观和高效,帮助开发者更轻松地处理有序集合。

阅读 50
0 条评论