Коллекции Google (библиотеки Guava): ImmutableSet/List/Map and Filtering
Предположим, что вы хотите создать копию ImmutableSet
/List
/Map
объект, но отфильтровать некоторые оригинальные записи. Одним из способов реализации этого является следующее:
ImmutableList.copyOf(Iterables.filter(myObject, myObject.EQUALS));
где myObject.EQUALS
является предикатом для Iterables.filter()
операция. Я думаю, что это довольно элегантная и легкая для чтения реализация. Тем не менее, один создает два списка объектов (сначала через Iterables.filter(...)
звонок, второй через ImmutableList.copyOf(...)
) что очень неэффективно.
Кто-нибудь знает более эффективный способ сделать это?
Я думаю, что лучше всего было бы добавить предикаты фильтра к ImmutableSet
/List
/Map
строители так, что объект должен быть построен только один раз. Но, к сожалению, такого параметра нет.
2 ответа
Результат Iterables.filter()
это просто просмотр данных в myObject
: новый список создается только ImmutableList.copyOf()
используя итератор фильтрации, предоставленный Iterable
Посмотрите на итераторы Гуавы
Специальный фильтр (Итератор нефильтрованный, Предикатный предикат)