我想在番石榴知道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
更快?
番石榴贡献者在这里。
Collections2.filter(elements, predicate).size()
是优选的,因为它没有复制 - 两个filter
方法返回一个视图 - 但是
Iterables.size(Iterables.filter(elements, predicate))
本质上是等价的,并且在没有任何复制的情况下也会找到答案。
至于构造ArrayList
与ImmutableList
的相对速度,它取决于您使用的构造方法:
ImmutableList.copyOf(collection)
应该花费几乎完全相同的时间。 (它必须检查空值,但这很便宜。)ImmutableList.builder()....build()
需要更长的小常数因子,因为它必须在ArrayList
中使用Builder
,因为我们事先不知道将添加多少元素。ImmutableList.of(...)
的速度大致相同。也就是说,使用ImmutableList
的概念上的好处往往超过了小的性能成本,特别是如果你经常传递列表。