Eclipse Collections:让Java Streams更上一层楼
\
关键要点
\\
- Eclipse Collections是一个高性能的Java集合框架,为原生JDK集合增加了丰富的功能。\\t
- Streams是JDK的一个非常受欢迎的功能,但它缺少了一些特性,严重依赖旧版的集合实现和冗长的API。\\t
- Eclipse Collections为传统JDK数据结构提供了替代品,并支持Bag和Multimap等数据结构。\\t
- 将Streams重构为Eclipse Collections有助于提高代码可读性并减少内存占用。\\t
- 最重要的是,使用Eclipse Collections来重构Streams非常简单!\
\\
在Java 8中引入的Java Streams非常棒——让我们可以充分利用lambda表达式来替换循环迭代代码,让代码更加接近于函数式编程风格。
\\
然而,尽管Streams带来了改进,但它最终只是对现有集合框架的扩展,仍然背着很多包袱。
\\
我们可以进一步改进吗?我们能否拥有更丰富的接口和更清晰、更易读的代码?与传统的集合相比,我们能否节省更多内存?我们能否更好、更无缝地支持函数式编程?
\\
答案是肯定的!Eclipse Collections(以前叫作GS Collections)是Java Collections框架的一个替代品,我们可以用它来实现我们的目的。
\\
在本文中,我们将演示几个例子,将标准的Java代码重构成Eclipse Collections数据结构和API,以及如何节省内存。
\\
这里将会有很多代码示例,它们将展示如何将使用标准Java集合和Streams的代码改为使用Eclipse Collection框架的代码。
\\
在深入研究代码之前,我们将花一些时间来了解Eclipse Collections是什么、我们为什么需要它,以及为什么需要将惯用的Java重构成Eclipse Collections。
\\
\
Eclipse Collections的历史
\\
Eclipse Collections最初是由高盛公司创建的,他们的应用平台有一个大型的分布式缓存组件。该系统将数百GB的数据存储在内存中(现在仍在生产环境运行)。
\\
事实上,缓存就是一个Map,我们在Map里保存和读取对象。这些对象可以包含其他Map和集合。最初,缓存基于java.util.*包中的标准数据结构而构建。但很明显,这些集合有两个明显的缺点:内存使用效率低下,而且接口非常有限(导致重复且难以阅读的代码)。由于问题源于集合的实现,因此无法通过额外的代码库来解决这些问题。为了同时解决这两个问题,高盛公司决定从头开始创建一个新的集合框架。
\\
在当时,它似乎是一个激进的解决方案,不过它确实可行。现在,这个框架托管给了Eclipse基金会。
\\
在文章的最后,我们分享了一些链接,这些链接将帮助你了解有关这个项目本身的更多信息、学习如何使用Eclipse Collections以及如何成为这个项目的代码贡献者。
\
\\
为什么要重构为Eclipse Collections?
\\
Eclipse Collections有什么好处?因为它提供了更丰富的API、高效的内存使用以及更好的性能。在我们看来,Eclipse Collections是Java生态圈中最为丰富的集合库。而且它与JDK中的集合完全兼容。
\\
轻松迁移
\\
在深入了解这些好处之前,请务必注意,迁移到Eclipse Collections非常容易,不一定要一次性完成所有工作。Eclipse Collections完全兼容JDK的java.util.* List、Set和Map接口。它也与JDK中的其他库兼容,比如Collectors。我们的数据结构继承了JDK的这些接口,所以它们可以作为JDK对应的替代品(不过Stack接口是不兼容的,还有新的不可变集合也不兼容,因为在JDK中不存在相应的接口)。
\\
更丰富的API
\\
实现了java.util.List、Set和Map接口的Eclipse Collections具有更丰富的API,我们将在后面的代码示例中探讨这些API。JDK中缺少了一些类型,例如Bag、Multimap和BiMap。Bag是一种多重集,可以包含重复元素。从逻辑上讲,我们可以将其视为元素到它们出现次数的映射。BiMap是一种“倒置”的Map,不仅可以通过按键来查找值,也可以通过值来查找键。Multimap是一种Map,它的值就是集合(如Key-\u0026gt;List、Key-\u0026gt;Set等)。
\\
eager还是lazy?
\\
在使用Eclipse Collections时,我们可以非常容易地在lazy和eager两种实现模式间切换,有助于编写、理解和调试函数式代码。与Streams API不同的是,eager是默认的模式。如果你想要使用lazy模式,只需要在开始你的逻辑代码之前,在你数据结构上调用.asLazy()。
\\
不可变集合接口
\\
有了不可变集合,你可以在API层面通过不可变性写出更加正确的代码。在这种情况下,程序的正确性将由编译器来保证,避免在执行过程中出现意外。借助不可变集合和更丰富的接口,你可以在Java中写出纯函数式代码。
\\
原始类型集合
\\
Eclipse Collections也提供了原始类型的容器,所有原始集合类型都有不可变的对等物。值得一提的是,JDK的Streams支持int、long和double,而Eclipse Collections支持所有八个原始类型,并且可以定义用于直接保存原始值的集合(与它们的装箱对象不同,例如Eclipse Collections IntList是一个int列表,而JDK中的List\u0026lt;Integer\u0026gt;是一个装箱的原始值列表)。
\\
没有“bun”方法
\\
什么是“bun”方法?这是由Oracle Java首席设计师Brian Goetz发明的一个比喻说法。一个汉堡包(两片圆面包中间夹着肉)代表典型的流式代码结构。在使用Java Streams时,如果你想做点什么,必须把你的方法放在两块“面包”之间——前面是stream()(或parallelStream())方法,后面是collect()方法。这些面包其实没有什么营养,但如果没有它们,你就无法吃到肉。在Eclipse Collections中,这些方法不是必需的。下面的例子演示了JDK中的bun方法:假设我们有一个名单,上面有他们的姓名和年龄,我们想要取出年龄超过21岁的人的姓名:
\\
\var people = List.of(new Person(\"Alice\
Eclipse Collections:让Java Streams更上一层楼相关推荐
- Eclipse Collections随Java版本的演变
\ 本文要点 \\ Eclipse Collections是一个高性能的Java集合框架,针对Java 8及以上版本进行了重新设计,极大地丰富了这个Java Collections框架的功能.\\t ...
- Java Streams:流操作及示例
正如我们在Java Streams:流创建中所学到的,流管道由源.零个或多个中间操作和一个终端操作组成. 我们还了解到,streams流是懒惰的:仅当终端操作启动时,才对源数据执行计算. 在本文中,我 ...
- eclipse java调用c 代码吗_linux下通过eclipse开发用java调用c程序的方法
linux下通过eclipse开发用java调用c程序的方法: 1.先建立好java工程并建立java文件如下: public class testso { static { ...
- eclipse java 7_在Eclipse中编程Java 7
我安装了JDK 7和Eclipse 3.6M6.然后,我将JRE 7添加为Eclipse中的新JRE执行环境,并将编译器的遵从性级别设置为Java7.我可以使用javacJDK 7随附的命令行通过命令 ...
- 在Eclipse中导入Java程序
在Eclipse中导入Java程序 在 Eclipse 中导入 Java 程序 在 Eclipse 中导入 Java 程序,分导入Java Project和导入Java源程序 两种情况,简述如下. 情 ...
- Eclipse里的Java EE视图在哪里?MyEclipse里的Java EE视图在哪里?MyEclipse里的MyEclipse Java Enterprise视图在哪里?(图文详解)...
为什么要写这篇博客呢? 是因为,最近接触一个web项目. 然后呢,Eclipse里的Java EE视图的位置与MyEclipse里不太一样.为了自己梳理日后查找,也是为了新手少走弯路. Eclipse ...
- (0017)iOS 开发之Mac上安装Eclipse、创建java后台程序访问本地数据库
Mac 上安装Eclipse 1. Eclipse下载列表: http://www.eclipse.org/downloads/packages/release/Neon/2 2.不同的开发需求下载不 ...
- Eclipse IDE for Java EE Developers 与Eclipse Classic 区别
eclipse下载官网:eclipse下载 版本: 1.eclipse classic 是eclipse的标准版:标准版; 2.eclipse ide for java developer : 标准版 ...
- Java Streams,第 4 部分: 从并发到并行
2019独角兽企业重金招聘Python工程师标准>>> Java Streams,第 4 部分: 从并发到并行 Java Streams 系列的第 4 期文章将解释决定并行处理的有效 ...
最新文章
- 第十章 基本数据结构——栈和队列
- LINUX 下面SQL定时备份
- gb50268-2008给水排水管道施工及验收规范_20135城市非开挖管道施工质量检查与验收(夯管·定向钻·顶管)...
- char添加一个字符_给你五十行代码把图片变成字符画!程序:太多了,一半都用不完...
- 精华阅读第6期|程序猿的世界,你不懂!
- 做游戏,学编程(C语言) 9 贪吃蛇
- 一道简单而又容易出错的题目
- 04 ZooKeeperAPI实战
- github本地库及clone常用命令
- Spring知识点简介
- 普通IC、M1、UID、CUID、FUID、UFUID卡的区别
- 激光测距芯片VL53L0X的使用与代码
- linux安装wine
- android如何加密所有的布局文件夹,android:是否可以加密文件夹
- 普通用户与root用户的相互切换
- 阿里天池课堂Python
- mc服务器linux配置,详细教程——基于Centos搭建MC服务器(outdated)
- 大数据 Linux 搭建(一)
- python实现归一化与标准化
- Spring笔记(4):响应式编程、Reactor、WebFlux、Flow
热门文章
- 学网络好帮手:路由器模拟软件RouteSim3.31
- 闲话网名之“jrfly331”
- 字段定义_两大高招逐浪CMS中定义省地市县三级字段显示方式
- windows——celery
- SQL语句复习【专题八】
- dubbo服务使用spring-data-mongodb进行时间查询的bug记录
- bzoj 4747: [Usaco2016 Dec]Counting Haybales
- System.arraycopy(src, srcPos, dest, destPos, length) 与 Arrays.copyOf(original, newLength)区别
- Android Studio 提示Error running app: No Android facet found for app
- 再发些CSS常用技巧和兼容方案