Ответ 1
Это может быть проще:
return Iterables.size(Iterables.filter(iterable, predicate));
Он избегает выделения всей памяти этого массива.
Неужели нет метода, который определяет количество элементов, которые удовлетворяют Предикату в Iterable? Был ли я прав:
return Lists.newArrayList(Iterables.filter(iterable, predicate)).size()
Если да, то в чем причина отсутствия метода
Iterable.frequency(Iterable<T>, Predicate<T>)
Приветствия
Это может быть проще:
return Iterables.size(Iterables.filter(iterable, predicate));
Он избегает выделения всей памяти этого массива.
Когда итерабельность представляет собой коллекцию, вы можете сказать
return Collections2.filter(collection, predicate).size();
Не было большого спроса на метод Iterable.frequency(итерируемый, предикат).
Этот метод фильтра не создает коллекцию. Он создает новый Iterable с новым итератором, и фильтрация выполняется on demand
, например, когда вы на самом деле перебираете Iterable.
Итак, структура guava может иметь метод frequency(Iterable, Predicate)
, но этот метод должен был бы создать итератор внутри, только чтобы получить количество шагов итерации. И выбросить его потом. И если ваш итератор работает с динамическими коллекциями (например, таблицами базы данных), частота "размер" и "размер" фильтра могут даже отличаться.
Если вам нужны оба (итератор и размер), возьмите итерабельность, подайте его в подходящую коллекцию (заморозить) и используйте методы коллекции size()
. Это гарантирует истинное значение размера для (замороженной) коллекции на основе фильтрованного Iterable.