java21学习笔记-序列集合
引入新的接口来表示具有定义的相遇顺序的集合。每个这样的集合都有一个明确定义的第一个元素、第二个元素,依此类推,直到最后一个元素。它还提供统一的 API 来访问其第一个和最后一个元素,并以相反的顺序处理其元素。
Sequenced collections
interface SequencedCollection<E> extends Collection<E> {// new methodSequencedCollection<E> reversed();// methods promoted from Dequevoid addFirst(E);void addLast(E);E getFirst();E getLast();E removeFirst();E removeLast();
}
List<String> list = new ArrayList<>();list.add("1"); list.add("4");list.add("6"); list.add("2");list.add("9"); list.add("3");System.out.println(list.getFirst()); //1System.out.println(list.getLast()); //3System.out.println(list.removeFirst()); //1System.out.println(list); //[4, 6, 2, 9, 3]System.out.println(list.removeLast()); //3System.out.println(list); //[4, 6, 2, 9] list.addFirst("6");System.out.println(list); //[6, 4, 6, 2, 9]System.out.println(list.reversed()); //[9, 2, 6, 4, 6]
Sequenced sets
interface SequencedSet<E> extends Set<E>, SequencedCollection<E> {SequencedSet<E> reversed(); // covariant override
}
LinkedHashSet<String> set = new LinkedHashSet<>();set.add("1"); set.add("5");set.add("9"); set.add("2");set.add("4"); set.add("7");Set<String> collect = new HashSet<>(set);System.out.println(collect); //[1, 2, 4, 5, 7, 9]LinkedHashSet<String> set1 = new LinkedHashSet<>(collect);System.out.println(set1.reversed());//[9, 7, 5, 4, 2, 1]
Sequenced maps
interface SequencedMap<K,V> extends Map<K,V> {// new methodsSequencedMap<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 NavigableMapEntry<K, V> firstEntry();Entry<K, V> lastEntry();Entry<K, V> pollFirstEntry();Entry<K, V> pollLastEntry();
}
SequencedMap<String, String> map = new LinkedHashMap<>();map.put("name", "张三"); map.put("age", "18");map.put("nickname", "法外狂徒"); map.put("sex", "男");System.out.println(map); //{name=张三, age=18, nickname=法外狂徒, sex=男}System.out.println(map.reversed()); //{sex=男, nickname=法外狂徒, age=18, name=张三}SequencedSet<String> sequencedKeySet = map.sequencedKeySet();System.out.println(sequencedKeySet); //[name, age, nickname, sex]SequencedCollection<String> sequencedValues = map.sequencedValues();System.out.println(sequencedValues); //[张三, 18, 法外狂徒, 男]SequencedSet<Map.Entry<String,String>> sequencedEntrySet = map.sequencedEntrySet();System.out.println(sequencedEntrySet); //[name=张三, age=18, nickname=法外狂徒, sex=男]map.putFirst("first","first");System.out.println(map); //{first=first, name=张三, age=18, nickname=法外狂徒, sex=男}map.putLast("last","last");System.out.println(map); //{first=first, name=张三, age=18, nickname=法外狂徒, sex=男, last=last}System.out.println(map.firstEntry()); //first=firstSystem.out.println(map.lastEntry()); //last=lastSystem.out.println(map.pollFirstEntry());//first=firstSystem.out.println(map); //{name=张三, age=18, nickname=法外狂徒, sex=男, last=last}System.out.println(map.pollLastEntry());//last=lastSystem.out.println(map); //{name=张三, age=18, nickname=法外狂徒, sex=男}
改造
上面定义的三个新接口完全适合现有的集合类型层次结构
List
现在将SequencedCollection
作为其直接超接口
Deque
现在将SequencedCollection
作为其直接的超级接口
LinkedHashSet
还实现了 SequencedSet
SortedSet
现在将SequencedSet
作为其直接超接口
LinkedHashMap
还实现了SequencedMap
SortedMap
现在将SequencedMap
作为其直接的超级接口
Collections
实用程序类添加了新方法,为三种新类型创建不可修改的包装器
Collections.unmodifiableSequencedCollection(sequencedCollection)
Collections.unmodifiableSequencedSet(sequencedSet)
Collections.unmodifiableSequencedMap(sequencedMap)
var unmodifiableSequencedCollection = Collections.unmodifiableSequencedCollection(sequencedValues);System.out.println(unmodifiableSequencedCollection); //[张三, 18, 法外狂徒, 男]var unmodifiableSequencedSet = Collections.unmodifiableSequencedSet(sequencedEntrySet);System.out.println(unmodifiableSequencedSet); //[name=张三, age=18, nickname=法外狂徒, sex=男]var unmodifiableSequencedMap = Collections.unmodifiableSequencedMap(map.reversed());System.out.println(unmodifiableSequencedMap); //{sex=男, nickname=法外狂徒, age=18, name=张三}