你知道Java21中的顺序集合吗? 你知道java21中的顺序集合吗?举例说明
yuyutoo 2024-10-12 01:24 2 浏览 0 评论
在Java 21中,处理集合的方式得到了改进,因为三个新的接口已经融入了现有的类型层次结构。这些顺序集合为我们提供了一个统一的API来访问第一个和最后一个元素,并以相反的顺序处理集合。
为了更好地理解顺序集合是什么,让我们回顾一下集合之前的样子。
Java集合框架
在Java 1.2中引入的Collections Framework,为我们提供了许多接口和类来代表一组对象。这个统一的API具有许多优点,比如使不相关的API之间具有“标准化”的集合类型互操作性,因此促进代码重用。
十几个接口为底层通用和专用实现提供了一个很好的抽象,包括并发环境的实现。尽管不同集合类型的类型层次结构和功能经过精心设计,提供了很大的灵活性和功能,但直到现在才出现了一个缺失的方面……
从前到后,从后到前
获取集合的第一个或最后一个元素是一个非常常见的任务,通常这样做并不漂亮……我敢肯定,正在阅读这篇文章的每个人都曾经无数次地这样做过:
List items = ...; String first = items.get(0); String last = items.get(items.size() - 1);
一些集合类型支持直接访问第一个和最后一个元素,但目前还没有一个共同的接口,也没有一个通用的API(尚不支持):
Type | First Element | Last Element --------- | ----------------- | -------------------------- List | list.get(0) | list.get(list.size() - 1) Deque | deque.getFirst() | deque.getLast() SortedSet | sortedSet.first() | sortedSet.last()
每一个基于Collection的类型都可以很容易地从前往后遍历,因为它是Iterator的后代。这样,我们就可以使用for-each循环、Stream管道,并通过调用toArray()创建任何集合的数组。然而,对于反向遍历,即从后往前,目前还没有简单的方法或技巧。这意味着,例如,如果我们必须处理一个LinkedHashSet,我们必须遍历整个集合才能得到最后一个元素。
直到Java 21顺序集合的出现!
序贯集合类型
JEP 431在集合框架的类型层次结构中引入了三个新的接口,位置十分关键。像过去几年中的许多其他特性一样,这些接口通过默认方法注入新的功能,因此一切仍然保持向后兼容,除非我们想要更特殊的实现,否则没有人需要自己实现这些方法。
这三个新的序贯接口是:
SequencedCollection<E> extends Collection<E>
SequencedSet<E> extends SequencedCollection<E>, Set<E>
SequencedMap<K, V> extends Map<K, V>
SequencedMap
SequencedMap<K, V>接口看起来就像你期望的那样,特别是由于除了reversed()之外的所有方法都是从已有的Deque<E>类型中提升而来的,以提供一个已知且统一的API:
interface SequencedMap<K, V> extends Map<K, V> { // NEW METHOD SequencedMap<K, V> reversed(); // PROMOTED METHODS FROM Deque<E> void putFirst(K key, V value); void putLast(K key, V value); V getFirst(K key); V getLast(K key); V removeFirst(K key); V removeLast(K key); }
add...和remove...方法是可选的,并在其默认实现中抛出UnsupportedOperationException以支持不可修改的集合。get...方法的行为类似于其兄弟,在集合为空的情况下抛出NoSuchElementException。
SequencedSet
SequencedSet<E>基于SequencedCollection<E>,但具有reversed()方法的协变覆盖:
interface SequencedSet<E> extends SequencedCollection<E>, Set<E> { SequencedSet<E> reversed(); }
之前提到的行为仍然有效,因为SequencedCollection<E>的默认实现中没有覆盖任何方法。
SequencedMap<K, V>
SequencedMap<K, V>是基于SequencedCollection<E>但具有协变覆盖的返回类型:
interface SequencedMap<K, V> extends SequencedCollection<Map.Entry<K, V>>, Map<K, V> { SequencedMap<K, V> reversed(); }
之前提到的行为仍然有效,因为SequencedCollection<E>的默认实现中没有覆盖任何方法。尽管在概念上不同于其他集合作为基于键值对的数据结构,但是采用顺序化方法仍然可以获得很多好处。与 SequencedCollection<E> 类似, SequencedMap<K, V> 的类型也是从预先存在的类型中获得其功能,在此为 NavigableMap<K, V>:
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 key, V value); V putLast(K key, V value); // PROMOTED METHODS FROM NavigableMap<K, V> Entry<K, V> firstEntry(); Entry<K, V> lastEntry(); Entry<K, V> pollFirstEntry(); Entry<K, V> pollLastEntry(); }
有趣的是,有两个促进的 poll... 方法,因为它们让我们可以轻松地访问第一个或最后一个条目,并且一次性删除它。
扩展Java的集合框架
如前所述,这三种新类型被改造后直接集成到现有的类型层次结构中,以在不破坏任何兼容性的情况下为我们提供所有新的好东西:
整个类型层次结构中的 Sequenced Collections 类型(来源:JEP 431)
基于 Collection 的类型更改如下:
List 和Deque 现在将 SequencedCollection 作为它们的直接超接口。
SortedSet 现在直接从 SequencedSet 派生。以下是翻译后的内容:
现在,LinkedHashSet 实现了 SequencedSet 接口,并额外实现了 SequencedSet。
对于 Map 的更改并不多,SequenceMap 类型直接位于 Map 之下,而其上方是 SorterMap 的新超接口和 LinkedHashMap 实现的额外接口。
为了与 Collections Framework 的总体主题相匹配,Collections 上还有三个新的 static 帮助方法:
Collections.unmodifiableSequencedCollection(sequencedCollection)
Collections.unmodifiableSequencedSet(sequencedSet)
Collections.unmodifiableSequencedMap(sequencedMap)
结论:
我认为,在 Java 中引入明确定义的元素顺序和统一的 API 是一项受欢迎的改进。它将为开发人员提供更直接的方式来简化常见的集合任务,并逐步为 Java 类型添加更多便利。虽然与其他语言相比可能不够简洁和全面,但我相信会越来越完善的。
如果各位觉得老七的文章还不错的话,麻烦大家动动小手,
点赞、关注、转发走一波!!
有任何问题可以评论区留言或者私信我,我必将知无不言言无不尽!
相关推荐
- MySQL5.5+配置主从同步并结合ThinkPHP5设置分布式数据库
-
前言:本文章是在同处局域网内的两台windows电脑,且MySQL是5.5以上版本下进行的一主多从同步配置,并且使用的是集成环境工具PHPStudy为例。最后就是ThinkPHP5的分布式的连接,读写...
- thinkphp5多语言怎么切换(thinkphp5.1视频教程)
-
thinkphp5多语言进行切换的步骤:第一步,在配置文件中开启多语言配置。第二步,创建多语言目录。相关推荐:《ThinkPHP教程》第三步,编写语言包。视图代码:控制器代码:效果如下:以上就是thi...
- 基于 ThinkPHP5 + Bootstrap 的后台开发框架 FastAdmin
-
FastAdmin是一款基于ThinkPHP5+Bootstrap的极速后台开发框架。主要特性基于Auth验证的权限管理系统支持无限级父子级权限继承,父级的管理员可任意增删改子级管理员及权限设置支持单...
- Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示
-
本文实例讲述了Thinkphp5.0框架实现控制器向视图view赋值及视图view取值操作。分享给大家供大家参考,具体如下:Thinkphp5.0控制器向视图view的赋值方式一(使用fetch()方...
- thinkphp5实现简单评论回复功能(php评论回复功能源码下载)
-
由于之前写评论回复都是使用第三方插件:畅言所以也就没什么动手,现在证号在开发一个小的项目,所以就自己动手写评论回复,没写过还真不知道评论回复功能听着简单,但仔细研究起来却无法自拔,由于用户量少,所以...
- ThinkPHP框架——实现定时任务,定时更新、清理数据
-
大家好,我是小蜗牛,今天给大家分享一下,如何用ThinkPHP5.1.*版本实现定时任务,例如凌晨12点更新数据、每隔10秒检测过期会员、每隔几分钟发送请求保证ip的活性等本次分享,主要用到一个名为E...
- BeyongCms系统基于ThinkPHP5.1框架的轻量级内容管理系统
-
BeyongCms内容管理系统(简称BeyongCms)BeyongCms系统基于ThinkPHP5.1框架的轻量级内容管理系统,适用于企业Cms,个人站长等,针对移动App、小程序优化;提供完善简...
- YimaoAdminv3企业建站系统,使用 thinkphp5.1.27 + mysql 开发
-
介绍YimaoAdminv3.0.0企业建站系统,使用thinkphp5.1.27+mysql开发。php要求5.6以上版本,推荐使用5.6,7.0,7.1,扩展(curl,...
- ThinkAdmin-V5开发笔记(thinkpad做开发)
-
前言为了快速开发一款小程序管理后台,在众多的php开源后台中,最终选择了基于thinkphp5的,轻量级的thinkadmin系统,进行二次开发。该系统支持php7。文档地址ThinkAdmin-V5...
- thinkphp5.0.9预处理导致的sql注入复现与详细分析
-
复现先搭建thinkphp5.0.9环境...
- thinkphp5出现500错误怎么办(thinkphp页面错误)
-
thinkphp5出现500错误,如下图所示:相关推荐:《ThinkPHP教程》require():open_basedirrestrictionineffect.File(/home/ww...
- Thinkphp5.0极速搭建restful风格接口层
-
下面是基于ThinkPHPV5.0RC4框架,以restful风格完成的新闻查询(get)、新闻增加(post)、新闻修改(put)、新闻删除(delete)等server接口层。1、下载Thin...
- 基于ThinkPHP5.1.34 LTS开发的快速开发框架DolphinPHP
-
DophinPHP(海豚PHP)是一个基于ThinkPHP5.1.34LTS开发的一套开源PHP快速开发框架,DophinPHP秉承极简、极速、极致的开发理念,为开发集成了基于数据-角色的权限管理机...
- ThinkPHP5.*远程代码执行高危漏洞手工与升级修复解决方法
-
漏洞描述由于ThinkPHP5框架对控制器名没有进行足够的安全检测,导致在没有开启强制路由的情况下,黑客构造特定的请求,可直接GetWebShell。漏洞评级严重影响版本ThinkPHP5.0系列...
- Thinkphp5代码执行学习(thinkphp 教程)
-
Thinkphp5代码执行学习缓存类RCE版本5.0.0<=ThinkPHP5<=5.0.10Tp框架搭建环境搭建测试payload...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- MySQL5.5+配置主从同步并结合ThinkPHP5设置分布式数据库
- thinkphp5多语言怎么切换(thinkphp5.1视频教程)
- 基于 ThinkPHP5 + Bootstrap 的后台开发框架 FastAdmin
- Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示
- thinkphp5实现简单评论回复功能(php评论回复功能源码下载)
- ThinkPHP框架——实现定时任务,定时更新、清理数据
- BeyongCms系统基于ThinkPHP5.1框架的轻量级内容管理系统
- YimaoAdminv3企业建站系统,使用 thinkphp5.1.27 + mysql 开发
- ThinkAdmin-V5开发笔记(thinkpad做开发)
- thinkphp5.0.9预处理导致的sql注入复现与详细分析
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)