java 21 - 序列集合
# 介绍
Sequenced Collections统一了与有序集合相关的操作,包括获取第一个和最后一个元素,在集合的头部和尾部插入和删除元素,以及逆序遍历集合等。
随着Sequenced Collections的引入,java集合框架结构变成了这样:
- List接口现在直接继承自SequencedCollection接口
- Deque接口现在直接继承自SequencedCollection接口
- LinkedHashSet类实现了SequencedSet接口
- SortedSet接口现在直接继承自SequencedSet接口
- LinkedHashMap类实现了SequencedMap接口
- SortedMap接口现在直接继承自SequencedMap接口。
在这之前,获取首尾元素的操作
- 一些是不必要的繁琐,如获取List的最后一个元素
- 有些甚至没有英雄主义是不可能的:获取LinkedHashSet的最后一个元素的唯一方法是迭代整个集合!
- 同样,从第一个元素到最后一个元素遍历通常需用迭代器或使用普通for循环,使代码冗长不直观
现在统一为了以下api,摘自官网 (opens new window):
# Sequenced collections
为解决这些问题,引入新接口SequencedCollection表示具有定义的遇到顺序的集合。每个SequencedCollection都有一个明确定义的第一个元素、第二个元素,依此类推,直到最后一个元素。它还提供统一的API访问它的第一个和最后一个元素,并以相反的顺序处理它的元素。
SequencedCollection还提供新reversed()方法,提供一个反向排序的视图。这视图可让集合以相反顺序处理元素,使用所有常见迭代机制,如增强for循环、显式的iterator()循环、forEach()、stream()、parallelStream()和toArray()。
如以前从LinkedHashSet获取反向排序的流困难,现只需linkedHashSet.reversed().stream()。
SequencedCollection还从Deque中提升一些方法,支持在两端添加、获取和删除元素:
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();
}
2
3
4
5
6
7
8
9
10
11
# Sequenced sets
Set接口的扩展,有序集合,不含重复元素:
interface SequencedSet<E> extends Set<E>, SequencedCollection<E> {
SequencedSet<E> reversed(); // covariant override
}
2
3
SequencedSet接口提供reversed()方法,用于返回一个反转顺序的SequencedSet。对于LinkedHashSet等集合,若元素已存在于集合中,则会将其移动到适当位置。这解决LinkedHashSet无法重新定位元素痛点。
# Sequenced maps
Map接口的扩展,条目具有定义好的遍历顺序。
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();
}
2
3
4
5
6
7
8
9
10
11
12
13
14
- reversed()返回一个反转顺序的SequencedMap
- sequencedKeySet()返回一个有序的键集合
- sequencedValues()返回一个有序的值集合
- sequencedEntrySet()返回一个有序的条目集合
SequencedMap还提供了putFirst()和putLast()方法,用于在指定位置插入键值对。对于SortedMap等映射,这些方法会抛出UnsupportedOperationException。
SequencedMap还提升了一些方法从NavigableMap接口,这些方法支持在两端获取和删除条目。
# 示例
public static void main(String[] args) {
List<Object> list = new ArrayList<>();
list.addFirst(1);
list.addLast(2);
list.getLast();
list.getFirst();
list.reversed().forEach(System.out::println);
SequencedMap<Object, Object> hashMap = new LinkedHashMap<>();
hashMap.putFirst(1, 2);
hashMap.putLast(3, 4);
hashMap.reversed().forEach((k, v) -> System.out.println(k + ":" + v));
SequencedSet<Object> set = new LinkedHashSet<>();
set.addFirst(1);
set.addLast(2);
set.getLast();
set.getFirst();
set.reversed().forEach(System.out::println);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
打印
2
1
3:4
1:2
2
1
2
3
4
5
6
总结:java21 在没有在增加实现类的情况下对api做了增强,只要是带有序的集合类都有了这个特性