Если все, что вы хотите сделать, - это выполнить итерацию по результату один раз или вам нужно многократно фильтрованное представление в режиме реального времени, вам, вероятно, нужен список без просмотра, содержащий совпадения. Создание List
или Set
для сохранения результата, а затем итерация по списку данных и добавление совпадений - это очень хороший подход и его легко понять!
List<Data> result = Lists.newArrayList();
for (Data data : data1) {
if (dataIds.contains(data.getId()))
result.add(data);
}
Я вижу, что ваш Data
класс реализует интерфейс Identifiable
. Учитывая это, вы можете создать Function<Identifiable, Integer>
, который получает идентификатор ... Identifiables.getIdFunction()
или что-то в этом роде. Это хорошо, потому что это, вероятно, было бы полезно в других местах (я говорю об этом подходе в блоге здесь ). Учитывая это, сделать это с помощью Guava также будет довольно просто:
Predicate<Identifiable> predicate = Predicates.compose(
Predicates.in(dataIds), Identifiables.getIdFunction());
List<Data> filtered = Lists.newArrayList(Iterables.filter(data1, predicate));
Это в основном функционально эквивалентно первому примеру, но, похоже, его будет сложнее понять. Поскольку в этом нет явной выгоды (в отличие от ситуации, когда вы хотите просто использовать просмотр в реальном времени), я бы порекомендовал просто перейти к первому.