Guava:Iterables.filter VS Collections2.filter,有什么大不同?

问题描述 投票:17回答:1

我想在番石榴知道Iterables.filter(Iterable, Predicate)Collections2.filter(Collection, Predicate)方法之间是否有任何差异?

它们似乎都维护迭代顺序,并提供实时视图。 Javadoc说调用Collections2.filter().size()会迭代所有元素。

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

但在后台,有没有区别:

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

和:

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

顺便说一句,建立一个ImmutableList比建立一个正常的ArrayList更快?

java java-ee guava
1个回答
23
投票

番石榴贡献者在这里。

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

是优选的,因为它没有复制 - 两个filter方法返回一个视图 - 但是

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

本质上是等价的,并且在没有任何复制的情况下也会找到答案。

至于构造ArrayListImmutableList的相对速度,它取决于您使用的构造方法:

  • ImmutableList.copyOf(collection)应该花费几乎完全相同的时间。 (它必须检查空值,但这很便宜。)
  • ImmutableList.builder()....build()需要更长的小常数因子,因为它必须在ArrayList中使用Builder,因为我们事先不知道将添加多少元素。
  • ImmutableList.of(...)的速度大致相同。

也就是说,使用ImmutableList的概念上的好处往往超过了小的性能成本,特别是如果你经常传递列表。

© www.soinside.com 2019 - 2024. All rights reserved.