\\\本文要点
\\
- Eclipse Collections是一个高性能的Java集合框架,针对Java 8及以上版本进行了重新设计,极大地丰富了这个Java Collections框架的功能。\\t
- 在2012年开源之前,该框架在Goldman Sachs内部已经开发了10年,那时称为GS Collections。2015年,它被迁移到Eclipse基金会。\\t
- 它使用原始的数据结构,性能优于传统的原始集合。\\t
- 在Eclipse Collections 8.0版本之前,EC兼容Java 5和7之间的版本。8.0及以上版本需要使用Java 8及以上版本,并且使用Optional处理潜在的null值。\\t
- 最新版本经过升级已经支持Java 9的模块。\
30秒简介——Eclipse Collections是什么?
\\Eclipse Collections是Java Collections框架的替代者。它提供JDK兼容的List、Set和Map实现,并且提供了丰富的API以及JDK中没有的其他类型,如Bags、Multimaps和BiMaps。Eclipse Collections还充分补充了原始容器。在2012年开源之前,该框架在Goldman Sachs内部已经开发了10年,那时称为GS Collections。2015年,它被迁移到Eclipse基金会。从那会开始,所有开发都是在Eclipse Collections名下完成的。如果你想阅读一些优质的介绍性文章,可以看下Donald Raab发表在InfoQ上的文章“GS Collections实例教程”第一部分和第二部分。
\\领域
\\在讨论任何细节或代码示例之前,让我们了解下本文的代码片段来自什么领域,如下图所示:
\\ \\我们有一个人的列表(类型为Person),每个人对应一个Pet列表,每只宠物都是枚举类型PetType中的一种。
\\面向Java 8的Eclipse Collections 8
\\在Eclipse Collections 8发布之前,EC兼容的Java版本为5和7之间的版本。开发人员也可以使用Java 8,既使用框架提供的丰富API,同时又充分利用Lambda表达式和方法引用的优势,而实际效果还不错。
\\但你能做的也就只有那些。Eclipse Collections与Java 8兼容,但它没有使用或包含Java 8。现在,从Eclipse Collections 8开始,我们已经决定兼容Java 8及以上版本,从而可以开始在我们的代码库中利用部分绝妙的Java 8新特性。
\\Optional
\\Optional是Java 8中最受欢迎的新特性之一。据Javadoc介绍,“一个容器对象可能包含也可能不包含非空值。如果值存在,那么isPresent()会返回true,而get()会返回那个值”。从根本上讲,Optional强制开发人员处理潜在的null项,帮助他们避免NullPointerExceptions。那么,我们可以在Eclipse Collections的那个地方使用这项特性呢?RichIterable.detectWith()非常适合。detectWith接收一个Predicate参数,返回集合中满足那个条件的第一个元素。如果它没有找到任何元素,则返回null。因而,在8.0版本中,我们引入了detectWithOptional()。该方法不会返回一个元素或null,它返回一个Optional对象,然后由用户来处理,参见下面的代码(来自我们的kata教程资料):
\\\Person person = this.people.detectWith(Person::named, \"Mary Smith\");\//空指针异常\Assert.assertEquals(\"Mary\