跳转至

集合工具

Kiwi-Collection 提供了一些与 Java 集合相关的工具类。

Lists

Lists 提供了一些针对 List<T> 的工具。

组合视图

我们有时候经常需要将两个或多个 List 合并作为某个参数传出或者用于遍历,这样做有两种方式:

  1. 拷贝到新的 List
    这样做很简单,但是对于长集合或者高频操作来说相当消耗内存。
var newList = new ArrayList<T>(listA.size() + listB.size());
newList.addAll(listA);
newList.addAll(listB);
return newList;

使用 Kiwi: Lists.ofCopiedCompoundList(listA,listB)

  1. 创建一个视图
    将两个 List 拼接到一起,避免花时间拷贝引用并且减少 GC 压力。

只需要使用 Lists.ofCompoundListView(listA, listB) 即可。

Warning

ofCompoundListView 返回的 List 不支持部分操作,例如 retainAll, removeAll, containsAllsubList,即使未来可能会支持。

使用组合视图的最佳实践是使其不可变,也就是说一旦创建了组合视图就不对其内容做变更。如果你发现组合后的 List 仍然需要大量修改操作,那么你应该考虑的是 ofCopiedCompoundList 而不是 ofCompoundListView,后者总是用于某些处理的中间过程。

如果你必须暴露组合视图,请考虑使用 JDK 提供的 Collections.unmodifiableList() 进行包装。

非空列表

非空列表 NonNullList<T> 阻止你插入 null 元素,并且承诺集合内没有空元素。 可以使用 Lists.noNullList(origin) 修饰一个列表。

Note

使用 NonNullList 时请准寻它的承诺,即被修饰过的集合内没有空元素。 这可以通过判断 origin.stream().anyMatch(Object::isNull) 实现

ArrayList 相关

  1. 工厂方法 你可以使用 Lists.newArrayList(T...) 创建一个新的 ArrayList,其容量即为参数数目。
  2. 快删 你可以使用 Lists.fastRemove(list,index/object)O(1) 时间删除 ArrayList 内的某个元素,这会导致列表内的元素顺序发生改变。

Info

ArrayList 的快删是通过将末尾的元素覆盖到目标元素的位置上实现的。

WeakHashSet

WeakHashSet 是基于 WeakHashMap 实现的。提供了和 HashSet 相当的查找/插入效率(但是可能稍慢些),并且具有 WeakHashMap 的特性——元素以弱引用形式储存。

这意味着,当其他地方没有对某个元素的引用时,这个元素就可能被从 WeakHashSet 中移除。通常来说,移除的时机是不确定的,从中处理元素时候要注意这一点。

另外,可以通过 disableResizing() 方法禁用底层 WeakHashMap 的自动扩容操作。

迭代器

Kiwi 还提供了一些简单的迭代器包装,分别是 ArrayIteratorInfiniteIteratorSingleIterator 关于他们的用法请前往 Javadoc 查阅。