写点什么

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

作者:A N M Bazlur Rahman

  • 2023-04-24
    北京
  • 本文字数:1607 字

    阅读完需:约 5 分钟

加入有序集合,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 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();}
复制代码


这三个新接口都刚好融入到现有的集合类型结构中,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/


相关阅读:

Java 近期新闻:JDK 21 发布计划、Payara 平台、JBang、JHipster、WildFly

甲骨文推出新的 Java SE 通用订阅

WireMock Spring Boot 将简化 Spring Boot 应用的 WireMock 配置

2023-04-24 08:003398

评论

发布
暂无评论
发现更多内容

Oracle EBS学习篇:Oracle EBS启用诊断功能

back_wang

如何开发一个小程序自定义组件

Onegun

小程序 前端 小程序组件

手势识别:让你的手成为计算机的新界面

来自四九城儿

一文带你了解 TypeScript 泛型

程序员海军

typescript 三周年连更

关于时间管理的一点建议

光毅

时间管理 Tech Lead

在企业内容城池边,它建立起一支保卫军

ToB行业头条

AE2023新版软件下载图文安装教程

好运

Adobe After Effects AE AE2023

Go语言并发编程核心-Channel的典型应用场景分析

Jack

智慧园区数字转型下的移动App建设策略

Onegun

移动应用 智慧城市 智慧园区

提交代码「前置处理」,向前一小步,效率提升「亿点点」

极狐GitLab

DevOps 极狐GitLab git hook lefthook 代码前置

Nautilus Chain :基于模块化架构的Layer3正在走向成熟

EOSdreamer111

灾备的级别和等级划分

穿过生命散发芬芳

灾备 三周年连更

北大GPT解题有数学老师内味了,用人话讲难题,从高中数学到高数都能搞定

Openlab_cosmoplat

人工智能 开源社区

深度分享 | API 测试经济学与 API First 践行

Apifox

程序员 前端 接口 后端 API

AI2023软件最新安装图文教程Illustrator

好运

Adobe Illustrator Illustrator ai2023

Nautilus Chain :基于模块化架构的Layer3正在走向成熟

股市老人

如何利用 Go 创建一个 Web 应用

宇宙之一粟

Go Web 服务端 客户端 三周年连更

Django笔记十六之aggregate聚合操作

Hunter熊

Python django 聚合 aggregate

TPU、TensorFlow—谷歌云“增强”AI 芯片团队,与微软云竞争AI云份额

B Impact

您有一份直播回放待查收!

BinTools图尔兹

直播回放 版本发布

HarmonyOS Codelabs最新参考

坚果

OpenHarmony 三周年连更

把“ai模型+低代码”应用在项目管理中,效率翻了好几倍

优秀

AI 低代码

向量嵌入:AutoGPT的幻觉解法?

OneFlow

PR软件2023最新图文安装教程

好运

PR Adobe Premiere Pro pr2023

Go RWMutex:高并发读多写少场景下的性能优化利器

陈明勇

Go golang 读写锁 三周年连更 RWMutex

九科信息流程挖掘产品bit-Miner即将开放面向对象流程挖掘能力

九科Ninetech

流程挖掘

卷起来了!阿里最新出品“微服务全阶笔记”,涵盖微服务全部操作

收到请回复

架构 #编程 #微服务

MegEngine 使用小技巧:量化

MegEngineBot

量化 MegEngine

视频大文件传输的演变:从“卷轴男孩”到自动化

镭速

MobTech MobLink|引流统计一站式服务

MobTech袤博科技

2022-04-25:给定两个长度为N的数组,a[]和b[] 也就是对于每个位置i来说,有a[i]和b[i]两个属性 i a[i] b[i] j a[j] b[j] 现在想为了i,选一个最

福大大架构师每日一题

golang 算法 rust 福大大

加入有序集合,Java集合框架变得更加完善_编程语言_InfoQ精选文章