Если вы выполняете короткий код без цикла и если ваш уровень API достаточно высок:
ArrayList<ArrayListModel> filteredList = new ArrayList<>(modelList);
filteredList.removeIf(m -> ! aList.contains(m.getId()));
Сначала он копирует исходный список, а затем удаляет из копии элементы, чей идентификатор не в aList
. Не ошибайтесь, конечно, в реализации removeIf
есть цикл (по-настоящему три цикла).
Если вы опасаетесь, что может потребоваться слишком много времени для выполнения с большим количеством данных : Подождите. Не оптимизируйте, прежде чем вы убедитесь, что это необходимо. Если вы беспокоитесь, проводите тесты на реальных объемах данных на компьютере, родственном вашему компьютеру с нагрузкой, аналогичной ожидаемой.
Если вы либо видели на производстве, либо в своих тестах, что выше занимает слишком много времени, первый прием заключается в том, чтобы поместить идентификаторы либо в HashSet
, либо в BitSet
, чтобы ускорить поиск. Например:
Set<Integer> ids = new HashSet<>(aList);
ArrayList<ArrayListModel> filteredList = new ArrayList<>(modelList);
filteredList.removeIf(m -> ! ids.contains(m.getId()));
Если вам нужно дополнительное ускорение, сортируйте оба списка по ID и используйте алгоритм слияния. Посмотрите, что это такое.
На настольном компьютере вы также можете получить ускорение от потока API и параллельных потоков. Является ли это также на устройстве Android, которое я не знаю.