Коллекции Google (библиотеки Guava): ImmutableSet / List / Map and Filtering - PullRequest
6 голосов
/ 30 мая 2011

Предположим, что вы хотите создать копию объекта ImmutableSet / List / Map, но отфильтровать некоторые исходные записи.Один из способов реализовать это:

ImmutableList.copyOf(Iterables.filter(myObject, myObject.EQUALS));

, где myObject.EQUALS - это предикат операции Iterables.filter().Я думаю, что это довольно элегантная и легкая для чтения реализация.Тем не менее, один создает два списка объектов (сначала через вызов Iterables.filter(...), затем через ImmutableList.copyOf(...)), что очень неэффективно.

Кто-нибудь знает более эффективный способ сделать это?

Полагаю, лучше всего было бы добавить предикаты фильтра к построителям ImmutableSet / List / Map, чтобы объект создавался только один раз.Но, к сожалению, такого параметра нет.

Ответы [ 2 ]

16 голосов
/ 30 мая 2011

Результат Iterables.filter() - это просто просмотр данных в myObject: новый список создается только ImmutableList.copyOf() с использованием итератора фильтрации, предоставленного Iterable

0 голосов
/ 30 мая 2011

Посмотрите на Итераторы Гуавы

Специальный фильтр (Итератор не отфильтрован, Предикат предиката)

...