Коллекции 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

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

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

Другие вопросы по тегам