Подтвердить что ты не робот

Guava: Iterables.frequency(Iterable <T>, Predicate <T>)

Неужели нет метода, который определяет количество элементов, которые удовлетворяют Предикату в Iterable? Был ли я прав:

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

Если да, то в чем причина отсутствия метода

Iterable.frequency(Iterable<T>, Predicate<T>)

Приветствия

4b9b3361

Ответ 1

Это может быть проще:

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

Он избегает выделения всей памяти этого массива.

Ответ 2

Когда итерабельность представляет собой коллекцию, вы можете сказать

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

Не было большого спроса на метод Iterable.frequency(итерируемый, предикат).

Ответ 3

Этот метод фильтра не создает коллекцию. Он создает новый Iterable с новым итератором, и фильтрация выполняется on demand, например, когда вы на самом деле перебираете Iterable.

Итак, структура guava может иметь метод frequency(Iterable, Predicate), но этот метод должен был бы создать итератор внутри, только чтобы получить количество шагов итерации. И выбросить его потом. И если ваш итератор работает с динамическими коллекциями (например, таблицами базы данных), частота "размер" и "размер" фильтра могут даже отличаться.

Если вам нужны оба (итератор и размер), возьмите итерабельность, подайте его в подходящую коллекцию (заморозить) и используйте методы коллекции size(). Это гарантирует истинное значение размера для (замороженной) коллекции на основе фильтрованного Iterable.