Java 21 已经在2023年9月19日(上周二)正式发布了。Java 21是最新的LTS(Long Time Support)版本,因此还没发布时就引起了许多开发人员的关注。此次版本升级,一共有 15 个功能进行了更新。
在这 15 个功能更新中,有类似于 ZGC、虚拟线程等热门讨论的技术。但是对于一个普通开发人员来说,我最感兴趣,也觉得最能覆盖日常使用的,反而是许多文章并未多少提及的顺序集合(Sequenced Collections)。这篇文章,我就来讲述为什么我认为顺序集合的引入,会让集合类的使用更加便利;同时也会讲解,我们该如何借助这一特性,更好编写代码。
前置知识
在Java 1.2 中,集合类被第一次引入到官方jar包中。提供的多种集合类,包括列表(List)、集合(Set)、映射(Map)等,满足了不同的数据存储和操作需求。这些集合类有很多优点,因此很快就成为了Java 开发人员使用频繁的工具类。
我们必须承认这些集合类的数据结构,已经经过了时间的考验,大部分功能都是经过深思熟虑后才引入,也拥有较强的灵活性和功能。但是目前来说,我们仍然可以发现,有些方面是缺失的。直到 Java 21的更新。
问题
对于日常的开发人员而言,获取集合类List
中的第一个和最后一个数据是十分常见的需求。通常来说,我们想要实现上面的要求,代码肯定是这样的
List list = new ArrayList();
//add some items
String first = list.get(0);
String end = list.get(list.size()-1);
并不是上述的代码有问题,主要的问题是不优雅。
我们如果把集合类全都拿来对比的话,会发现有些集合类是提供了直接访问第一个和最后一个元素的函数的。但是这些函数没有一通用的接口共享。
集合名称 | 获取第一个元素 | 获取最后一个元素 |
---|---|---|
List | get(0) | get(size-1) |
Deque | getFirst() | getLast() |
Set | first() | last() |
上面都还是线性的结合类。对于 Map 来说,我们没有这种方法,只能够使用Iterator
访问。那么就意味着我们如果想要获取Map的最后一个元素,就需要遍历一遍所有的元素。这太浪费时间了!
Java 21 做了什么优化
在 openjdk.org/jeps/431 中,我们可以看到官方引入了3个全新的接口。他们分别是:
-
SequencedCollection extends Collection
提供了一系列支持在两端进行常见操作以及支持正向和反向处理元素的方法。 引入了SequencedCollection接口,它扩展了Collection接口,并包含了reversed()方法来提供反向排序的视图。
-
SequencedSet extends SequencedCollection, Set
提供了与SequencedCollection相同的reversed()方法,以及在某些情况下可能抛出UnsupportedOperationException的addFirst(E)和addLast(E)方法。
-
SequencedMap extends Map
引入了SequencedMap接口,它扩展了Map接口,包含了一系列新方法,如reversed()、sequencedKeySet()、sequencedValues()等。 提供了putFirst(K, V)和putLast(K, V)方法,类似于SequencedSet中的方法,具有特殊的语义。
在上面3个接口引入后,我们之前常见的集合框架就有了很大的不同:
我们可以从图里得到以下的更新:
List
和Deque
现在共享SequencedCollection
作为它们的直接超级接口。这意味着现在List和Deque都继承自SequencedCollection接口,使它们具有了一致的顺序集合特性。这意味着它们都具备了处理顺序集合的方法。SortedSet
现在是SequencedSet
的直系后代这表示SortedSet现在直接继承自SequencedSet接口,而不再通过其他中间接口。这使得SortedSet具备了顺序集合的特性,包括处理顺序元素的方法。- 实现
LinkedHashSet
现在也是SequencedSet
。另外实现了SequencedSet
这意味着LinkedHashSet不仅是Set的实现,还具有了SequencedSet的特性。它可以处理具有顺序的元素,并支持相应的操作。 Map
的更改并不多,类型SequenceMap
直接位于 Map 之下,上面是SorterMap
的新超级接口以及用于实现LinkedHashMap
的附加接口。
一句话总结:使用 Java 21,集合类有着统一的获取第一个元素和最后元素的 API 接口了!
总结
我对Java引入了明确定义的遍历顺序和一致的API感到非常开心。这个变化为Java编程带来了许多好处。
首先,它使得处理集合变得更加直观和便捷。开发人员现在可以更轻松地执行一系列常见的集合操作,而无需担心遍历顺序的复杂性。
此外,这个改进还提高了代码的可读性和可维护性。由于引入了一致的API,不同的集合类型之间的切换变得更加无缝,使得代码更加清晰和一致。这对于团队合作和长期维护项目尤为重要。
如果你是技术经理,你会升级 Java 21吗?