java – Guava:Iterables.filter VS Collections2.filter,有什么大的区别?

如果在Iterables.filter(Iterable, Predicate)Collections2.filter(Collection, Predicate)之间的方法有差异,我想知道在番石榴吗?

他们似乎都保持迭代顺序,并提供实时视图.
Javadoc表示调用Collections2.filter(),size()将遍历所有元素.

假设我有一个谓词来过滤一个项目列表,结果我想要在视图中留下的项目数(或列表,无关紧要).我应该用什么?
使用Collections2.filter作为Collections()提供的size()方法似乎更简单.

但是在背景中,是否有区别:

ImmutableList.copyOf(
    Iterables.filter(lead.getActions(), isRealActionDoneByUserPredicate)
).size();

和:

Collections2.filter(lead.getActions(),isRealActionDoneByUserPredicate).size();

顺便说一句,建立一个不可替代的列表比建立一个正常的ArrayList更快?

番石榴贡献者在这里.

Collections2.filter(elements, predicate).size()

是最好的,因为它没有复制 – 两个过滤器方法返回一个视图 – 但是

Iterables.size(Iterables.filter(elements, predicate))

基本上是等价的,并且将类似地找到答案而没有任何复制.

对于构建ArrayList与ImmutableList的相对速度,它根据您使用的构造方法而有所不同:

> ImmutableList.copyOf(collection)应该花费几乎完全相同的时间量. (它必须检查空值,但这是便宜的.)
> ImmutableList.builder()…. build()占用较小的常数因子,因为它必须在Builder中使用ArrayList,因为我们不知道预先添加多少个元素.
> ImmutableList.of(…)将具有相同的速度.

也就是说,使用ImmutableList的概念优势往往超过了性能成本,特别是如果您经常传递列表.

翻译自:https://stackoverflow.com/questions/10834577/guava-iterables-filter-vs-collections2-filter-any-big-difference

转载注明原文:java – Guava:Iterables.filter VS Collections2.filter,有什么大的区别?