番石榴:Iterables.frequency(Iterable <t>,Predicate <t>)</t> </t>

时间:2010-12-08 13:14:11

标签: java guava

是否真的没有方法可以确定在Iterable中满足谓词的元素数量? 我是对的吗:

return Lists.newArrayList(Iterables.filter(iterable, predicate)).size()

如果是,那么没有方法

的原因是什么
Iterable.frequency(Iterable<T>, Predicate<T>)

干杯

3 个答案:

答案 0 :(得分:24)

这可能更容易:

return Iterables.size(Iterables.filter(iterable, predicate));

它避免了所有数组内存的分配。

答案 1 :(得分:4)

当iterable是一个集合时,你可以说

return Collections2.filter(collection, predicate).size();

对Iterable.frequency(可迭代,谓词)方法的需求不大。

答案 2 :(得分:3)

此过滤器方法不会创建集合。它使用新的迭代器创建一个新的Iterable,并且过滤完成on demand,就像实际迭代Iterable一样。

所以,是的,番石榴框架可能有一个frequency(Iterable, Predicate)方法,但是这个方法必须在内部创建迭代器才能获得迭代步骤的数量。然后扔掉它。如果您的迭代器适用于动态集合(如数据库表),则频率“大小”和过滤器“大小”可能会有所不同。

如果您同时需要(iterator 大小),请使用iterable,将其提供给合适的集合(冻结)并使用集合size()方法。这保证了基于过滤的Iterable的(冻结)集合的真实大小值。