\

关键要点

\\

  • 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更上一层楼的更多相关文章

  1. 启动eclipse时:java is started but returned code 13

    此问题是eclipse位数和java位数不匹配造成的 我的是win10 64位的eclipse + 32位的java造成的问题 查看eclipse位数:用记事本打开eclipse根目录下的eclips ...

  2. eclipse中 将java项目转换为web项目

    来自:http://jadethao.iteye.com/blog/1331308 eclipse中 将java项目转换为web项目 1.找到项目工作空间目录,打开.project文件,并修改文件,  ...

  3. Eclipse IDE for Java EE Developers 与 Eclipse Classic(Eclipse Standard)区别

    Eclipse下载官网:http://www.eclipse.org/downloads/ 版本: 1.Eclipse classic(Eclipse Standard):Eclipse的标准版; 2 ...

  4. 【转】Eclipse Class Decompiler——Java反编译插件

    闲暇之余,写了一个Eclipse下的Java反编译插件:Eclipse Class Decompiler,整合了目前最好的2个Java反编译工具Jad和JD-Core,并且和Eclipse Class ...

  5. eclipse ide for java ee developers 开发环境搭建(j2ee)

    转载自:http://www.iteye.com/topic/982182 真的是一片很不错的文章啊! 使用eclipse真的有年头了,相信java程序员没有不知道它的,最近在给团队中新来的应届生做指 ...

  6. 用Eclipse编写运行Java程序

    1.选择一个空的文件夹,作为workspace工作空间,用来存放你以后用eclipse写的Java程序.(一个workspace可以放很多很多project项目) 2.新建java项目:File-&g ...

  7. 利用eclipse新建的java web项目没有部署描述符web.xml文件怎么办?

    原文转自:http://blog.csdn.net/suyu_yuan/article/details/50947007 利用eclipse新建的Java Web项目没有部署描述符web.xml文件, ...

  8. 将Maven项目转换成Eclipse支持的Java项目

    当我们通过模版(比如最简单的maven-archetype-quikstart插件)生成了一个maven的项目结构时,如何将它转换成eclipse支持的java project呢? 1. 定位到mav ...

  9. 如何在Mac系统安装eclipse并运行java程序?

    链接地址:http://jingyan.baidu.com/article/7f41ecece8ef5b593c095c71.html eclipse现在也有 Mac版了,我们快来试一试吧!现在我将带 ...

随机推荐

  1. 九九乘法表 C语言

    无需输入,直接输出九九乘法表,特别简单. 运行结果如下: #include<stdio.h> int main() { ; ; , j = ; ; i < ; i++,b++) { ...

  2. go 切片重组

    我们已经知道切片创建的时候通常比相关数组小,例如: slice1 := make([]type, start_length, capacity) 其中 start_length 作为切片初始长度而 c ...

  3. Python 的while循环和for循环的使用

    #循环 遍历 迭代 # while循环 a = 0while a <5: a =a+1 if a == 3: continueprint('我循环了')+str(a) # print ('我循环 ...

  4. Array(数组)对象-->slice() 方法

    1.定义和用法 slice()方法可提取字符串的某个部分,并以新的字符串返回被提取的部分. 语法: array.slice(start, end) 参数:start 开始元素的下标,截取内容包含该元素 ...

  5. python3(三十七) filepath

    """ file path """ __author__on__ = 'shaozhiqi 2019/9/23' # !/usr/bin/e ...

  6. Powershell 输出信息过多,结尾显示省略号

    有时候我们通过powershell指令去查询某些信息时,因为输出结果过多,导致一部分重要信息被省略号代替,如下图 面对这种情况无论是 |fl 还是  out-file 亦或是 export-csv都无 ...

  7. 数据结构和算法(Golang实现)(23)排序算法-归并排序

    归并排序 归并排序是一种分治策略的排序算法.它是一种比较特殊的排序算法,通过递归地先使每个子序列有序,再将两个有序的序列进行合并成一个有序的序列. 归并排序首先由著名的现代计算机之父John_von_ ...

  8. Mycat使用配置实践

    本来写了好多,关于配置的解释和使用以及注意,但是发现有点啰嗦含金量也不高,所以直接把实际使用的一个例子放着吧,供参考. <!DOCTYPE mycat:schema SYSTEM "s ...

  9. delphi使用ADO在sql数据库存取图片的方法

    我一直不认为能把代码写的和天书一样的程序员是好的程序员,那不过是因为我真的对delphi也就是略懂皮毛,太深了看不懂.网上查询数据库存取图片的方式,看的是一头雾水,有人提出保存路径使用时再调用,方法很 ...

  10. PrestoSPI安全扩展

    由于Presto官方文档和谷歌搜索都没有相关的内容,git项目中也没有支持sentry的安全插件扩展,因此只能从源码中寻找答案,在梳理完SPI包的安全相关源码结构后,已实现了一个自定义的安全插件,经验 ...