是否否认数据结构很重要。 选择正确的程序将极大地提高程序/产品/应用程序的性能。
集合库随附了许多(主流)编程语言。 它提供了API和实现,使最终用户可以轻松实现。
这些实施速度很快,并且构建起来使最终用户更容易使用。
提供太多的选择会增加语言的学习曲线,提供的选择太多会导致用户执行繁琐。 因此,语言在提供内容时必须非常小心。
Eclipse collections provide optimized and efficient implementations of collections in Java.
Eclipse集合还添加了一些其他的数据结构,这些数据结构在Java核心中本身不可用。
但是最重要的是,Eclipse-Collections提供了可以使用的优雅,功能强大且流畅的API。
我喜欢Eclipse系列的主要原因如下:
- APIs are awesome. They are:功能性懒平行渴望(虽然经过优化)同时提供一成不变的和易变的馆藏provide highly optimized和memory-efficient implementation
Set things up
如果您使用的是马文项目包括蚀集合依赖项如下:
<dependency
<groupId>org.eclipse.collections</groupId>
<artifactId>eclipse-collections</artifactId>
<version>10.0.0</version>
</dependency>
如果您正在使用摇篮然后将其导入:
compile 'org.eclipse.collections:eclipse-collections-api:10.0.0'
compile 'org.eclipse.collections:eclipse-collections:10.0.0'
Ingredients
Eclipse集合包含以下数据结构:
- 清单组地图Bi地图Multi地图袋堆配对和其他
所有这些数据结构包括以下实现:
- 可变的一成不变的懒平行已订购已排序固定原始和其他
注意并非所有集合的所有实现。
Code, Code, Code...
There are few excellent code katas available. They are here.
让我们从一个开始清单。
要实例化新的可变列表,我们可以执行以下操作:
MutableList<Integer> firstTenNumbers = Lists.mutable.with(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
您可以使用实例化列表的。
MutableList<Integer> firstTenNumbers = Lists.mutable.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
Reterival
我们可以使用经典的检索元素获取(索引)办法。 Eclipse Collections还提供了一个getFirst()和getLast() method to retrieve the first和the last elements respectively.
firstTenNumbers.get(4); // 4
firstTenNumbers.getFirst(); // 0
firstTenNumbers.getLast(); // 9
在功能范式中,采取|采取While|下降|下降While APIs are awesome because they help to 采取 and 下降 certain elements from the list without mutating them。 With Eclipse Collections we can do that in 爪哇。
drop and take
功能下降和采取 each 采取 a ñoñ-ñegative iñteger ñ。 的下降 returñs all the elemeñts after the giveñ iñdex while the 采取 gives back all the elemeñts uñtil the iñdex.
firstTenNumbers.take(3); // 0, 1, 2
firstTenNumbers.drop(3); // 3, 4, 5, 6, 7, 8, 9
功能下降和采取可以通过以下函数指定:
list.take(n) + list.drop(n) == list
dropWhile and takeWhile
他们在技术上下降和采取 but instead of taking a number as an argument, they 采取 a 谓语功能。
的采取函数将返回所有值,直到谓词返回true。
firstTenNumbers.takeWhile(i -> i % 2 == 0); // 0
的dropWhile函数将返回列表中的所有值,之后谓词将返回true。
firstTenNumbers.dropWhile(i -> i % 2 == 0); // 1, 2, 3, 4, 5, 6, 7, 8, 9
convertors
通常,我们将需要转换器. The role of 转换器 is至change the list from one form至another. That is from 可变的至一成不变的或相反亦然。
我们可以通过实现可变和不可变分别起作用。
MutableList<T> iCanChange = Lists.mutable.with(T... args);
iCanChange.toImmutable(); // From now onwards I cannot Change
ImmutableList<T> iCannotChange = Lists.immutable.with(T... args);
iCannotChange.toMutable(); // From now on I can change
我们将需要颠倒我们的列表,并且API为我们提供了反转功能达到相同。
MutableList<T> normalList = Lists.mutable.with(T... args);
normalList.toReversed();
堆栈数据结构内置在库中。 我们可以将清单进入堆使用堆叠。
MutableList<Integer> firstTenNumbers = Lists.mutable.with(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
firstTenNumbers.toStack().pop(4); // 9, 8, 7, 6
还有许多其他转换器,例如设置,toSortedSet,地图,到BiMap,and others
zip
功能压缩将采取一对清单并将它们转换成对列表。 那是:
[T], [U] => [T, U]
MutableList<Integer> houseNumbers = Lists.mutable.with(123, 456, 789);
MutableList<String> owners = Lists.mutable.with("Ram", "Raj", "Rahul");
owners.zip(houseNumbers); // (Ram:123), (Raj:456), (Rahul:789)
同样重要的是要注意列表的长度不必相等。
功能压缩有很多用途,例如获得标量产品。
Select & Reject
选择和拒绝只不过是过滤器。 他们两个都将接受谓词。 的选择仅选择那些真正。 的拒绝仅选择那些are returning 假。
MutableList<Integer> evenNumbers = Lists.mutable.with(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
.select(i -> i % 2 == 0);
// 0, 2, 4, 6, 8
MutableList<Integer> oddNumbers = Lists.mutable.with(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
.reject(i -> i % 2 == 0);
// 1, 3, 5, 7, 9
请注意,您也可以rejectWith和selectWith。
partition
PartitionMutableCollection是基于谓词将可变集合拆分为两个可变集合的结果。 -Eclipse集合
MutableList<Integer> firstTenNumbers = Lists.mutable.with(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
System.out.println(firstTenNumbers.partition(i -> i % 2 == 0).getSelected()); // 0, 2, 4, 6, 8
的划分将接受该谓词并根据该谓词拆分列表。
请注意,您也可以partitionWith。
groupBy
有时我们需要将元素分组在一起,我们可以使用通过...分组为了这。 的通过...分组将接受谓词函数并根据谓词的返回值对元素进行分组。
MutableList<Integer> firstTenNumbers = Lists.mutable.with(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
System.out.println(firstTenNumbers.groupBy(i -> i % 2 == 0 ? "even" : "odd"));
// {even=[0, 2, 4, 6, 8], odd=[1, 3, 5, 7, 9]}
collect
的收藏或多或少类似于地图。 它具有谓词功能。 然后将函数应用于列表的所有值,并返回具有更新值的新列表。
MutableList<Integer> firstTenNumbers = Lists.mutable.with(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
System.out.println(firstTenNumbers.collect(i -> i + 1));
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
我们甚至可以做flatCollect。
distinct
不同顾名思义,收集不同数组中的值。
MutableList<Integer> distinctValueList = Lists.mutable.with(1, 1, 2, 3, 4).distinct();
// [1, 2, 3, 4]
anySatisfy, allSatisfy, and noneSatisfy
的任何|全部|无满意易于检查,并且懒惰地对其进行评估。 例如
MutableList<Character> gradeList = Lists.mutable.with('A', 'A', 'F', 'B');
Boolean isPass = gradeList.allSatisfy(c -> c != 'F'); // False
Boolean isFail = gradeList.anySatisfy(c -> c == 'F'); // True
Boolean isPass = gradeList.noneSatisfy(c -> c == 'F'); // False
max, min and sumOfInt
顾名思义,它们获得所提供列表中值的最大值,最小值和sumOfInt。
MutableList<Integer> firstTenNumbers = Lists.mutable.with(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
System.out.println(firstTenNumbers.min()); // 0
System.out.println(firstTenNumbers.max()); // 9
System.out.println(firstTenNumbers.sumOfInt(i -> i)); // 45
There is a lot of other APIs available, check out the full list here.
我们将继续提供有关以下内容的更深入的教程Eclipse集合。
如果您喜欢这篇文章,请留下喜欢或评论。 ❤️
如果您觉得文章有误/遗漏,请随时发表评论:)
You can follow me on Twitter.