Гуава: Iterables.frequency (Итерируемый <T>, Предикат <T>) - PullRequest
12 голосов
/ 08 декабря 2010

Действительно ли нет метода, который бы определял количество элементов, удовлетворяющих предикату в итерируемом? Была ли я права сделать это:

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

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

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

Приветствия

Ответы [ 3 ]

24 голосов
/ 08 декабря 2010

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

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

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

4 голосов
/ 12 декабря 2010

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

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

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

3 голосов
/ 08 декабря 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...