17

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

它们似乎既保持迭代顺序,又提供实时视图。Javadoc 说调用Collections2.filter().size()将遍历所有元素。

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

但在后台,是否有区别:

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

和:

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

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

4

1 回答 1

23

番石榴贡献者在这里。

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

更可取,因为它没有复制——两种filter方法都返回一个视图——但是

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

本质上是等效的,并且无需任何复制即可找到答案。

至于构建 anArrayList与 an的相对速度ImmutableList,取决于您使用的构建方法:

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

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

于 2012-05-31T13:29:56.887 回答