我有一个包含 1000 个元素的 A 类列表,其中所有元素都有唯一的 id。还有一些其他的 B 类,它也有一个唯一的 id 参数,并且这个 B 是 A 类的 json 属性。 关系如下:
A:{“id”:id1, “使用者”:{ "type": "一些代表 B 类的 ENUM", “id”:“id2”, } },
对象 A 中使用的对象 B 是独立的,也可以从其他请求中外部删除,这使得依赖的 A 对象过时/无效。系统中还可以有许多其他类型 B 的对象,并非所有对象都需要与 R 类型链接。
任务是检查系统中所有不再存在依赖B的无效A对象,并定期删除这些无效A。
任何人都可以告诉一个更好的方法来解决这个问题,谢谢。
首先,我列出了 l1 中 A 类的所有元素,然后列出了 l2 中 A 类中使用的 B 类的所有唯一 ID。 现在有一个列表 l3 ,其中收集了 B 类的所有此类无效 id,这些 ID 在 l2 中但不在 ( l1.gentContent().getUsedBy().getId() ) 中
现在列表 l3 包含所有此类不存在的类型 B id ,并且对于所有这些 id ,必须删除依赖的 A 类对象。但是该方法使用了许多 if else 和嵌套循环,这首先看起来并不令人印象深刻,而且软件质量检查也不可接受,因为方法中只允许使用 3 个 if/else/for 。
任何人都可以告诉一个更好的方法来解决这个问题,谢谢。
**这是我尝试过的截图样本**
public void validateForAutoCleanUp(OperationContext context, Page page) {
List invalidsToDelete = new ArrayList<>(); 列出现有 = page.getContent().stream().toList();
List<String> usedByIds = page.getContent().stream().map(Class A::getUsedBy).map(UsedBy::getId).toList();
List<Class B> b = service.getAllofTypeB(context, pageNumber, pageSize, null, null).block();
if (b != null) {
List<String> 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());
}
}
为了更有效地解决问题并降低 if 和 for 的复杂性,您可以使用 Set 来实现快速搜索并消除嵌套循环。
类似这样的:
public void validateForAutoCleanUp(OperationContext context, Page page) {
List<ClassA> existing = page.getContent();
Set<String> usedByIds = existing.stream()
.map(a -> a.getUsedBy().getId())
.collect(Collectors.toSet());
List<ClassB> classBList = service.getAllofTypeB(context, pageNumber, pageSize, null, null).block();
if (classBList != null) {
Set<String> validBIds = classBList.stream()
.map(ClassB::getId)
.collect(Collectors.toSet());
List<ClassA> invalidsToDelete = existing.stream()
.filter(a -> !validBIds.contains(a.getUsedBy().getId()))
.collect(Collectors.toList());
invalidsToDelete.forEach(a -> service.deleteById(context, a.getId()).block());
} else {
existing.forEach(a -> service.deleteById(context, a.getId()).block());
}
}