У меня есть список класса A из 1000 элементов, каждый из которых имеет уникальные идентификаторы. Существует другой класс B, который также имеет уникальный параметр id, и этот B является свойством json класса A.
отношение такое:
A : {**"id"** :id1,
**"usedBy"**: {
"type": "Some ENUM which represents class B",
"id": "id2",
}
},
Объект B, который используется в объекте A, является независимым и может быть удален извне из какого-либо другого запроса, что делает зависимый объект A устаревшим/недействительным. также в системе может быть много других объектов типа B и не все из них нужно связывать с типом R.
Задача состоит в том, чтобы проверить все такие невалидные объекты типа A, для которых зависимы B больше не существует в системе, и периодически удаляйте недействительные A.
Может ли кто-нибудь подсказать лучший способ решения этой проблемы, спасибо.
Во-первых, я перечислили все элементы класса A в l1, затем перечислили все уникальные идентификаторы класса B, которые используются в классе A в l2.
Теперь есть список l3, в котором собраны все такие недопустимые идентификаторы класса B, которые находятся в l2, но не в ( l1.gentContent().getUsedBy().getId() )
теперь есть список l3 со всеми такими несуществующими идентификаторами типа B и для всех этих идентификаторов необходимо удалить зависимый объект класса A. Но в этом подходе используется множество if else и вложенный цикл, что, во-первых, не кажется впечатляющим, а также неприемлемо для проверок качества программного обеспечения, поскольку в методе допускается только 3 if/else/for.
Может ли кто-нибудь подсказать лучший способ решения этой проблемы, спасибо.
**Это фрагмент, который я пробовал **
public void validateForAutoCleanUp(OperationContext context, Page page) {
List invalidsToDelete = new ArrayList();
List existing = page.getContent().stream().toList();
List usedByIds = page.getContent().stream().map(Class A::getUsedBy).map(UsedBy::getId).toList();
List b = service.getAllofTypeB(context, pageNumber, pageSize, null, null).block();
if (b != null) {
List invalidUsedByIds = usedByIds.stream().filter(id -> ! b.stream().map(Class B::getId).toList().contains(id)).toList();
if (!invalidUsedByIds.isEmpty()) {
for (Class A a : existing) {
for (String invalidId : invalidUsedByIds) {
if (a.getUsedBy().getId().equals(invalidId)) {
invalidsToDelete.add(a);
break;
}
}
}
if (!invalidsToDelete.isEmpty())
invalidsToDelete.forEach(i -> service.deleteById(context, i.getId()).block());
} else {
page.getContent().forEach(a -> service.deleteById(context, a.getId()).block());
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... ypes-class
Как эффективно проверять общие элементы двух списков разных типов (класса A и класса B) и составлять результирующий спис ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение