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

时间:2012-05-31 13:26:16

标签: java java-ee guava

我想在番石榴知道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要快吗?

1 个答案:

答案 0 :(得分:23)

番石榴贡献者。

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

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

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

基本上是等效的,同样会在没有任何复制的情况下找到答案。

至于构建ArrayListImmutableList的相对速度,根据您使用的构造方法而有所不同:

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

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