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