是否真的没有方法可以确定在Iterable中满足谓词的元素数量? 我是对的吗:
return Lists.newArrayList(Iterables.filter(iterable, predicate)).size()
如果是,那么没有方法
的原因是什么Iterable.frequency(Iterable<T>, Predicate<T>)
干杯
答案 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的(冻结)集合的真实大小值。