【发布时间】:2012-05-31 13:26:16
【问题描述】:
我想知道在 Guava 中 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 更快?
【问题讨论】:
-
只是说明显而易见的事情:一个给你
Iterable,另一个给你Collection。在Collections2.filter下方使用FilteredCollectionlink 将许多事情委托给Iterables/Iterators,因此应该没有功能差异。例如@Louis Wasserman 的回答表明FilteredCollection#size()正是Iterators.size(Iterators.filter(unfiltered.iterator(), predicate))。
标签: java jakarta-ee guava