如何筛选不在DynamicFields.type列表中的MDynamicFieldTypes对象
如何用一个对象列表过滤另一个对象列表?
Hey,这个需求很常见,用Java的Stream API就能优雅解决。先理清楚核心逻辑:我们要从dynamicFieldTypes里挑出那些没在dynamicFields的type属性里出现过的MDynamicFieldTypes对象,判断的关键是用唯一标识(比如id,毕竟对象引用可能不同但实际是同一个类型)。
实现步骤
- 先把
dynamicFields里所有type的id提取出来,存到一个Set里——集合的存在性判断比列表快得多,适合做这类过滤。 - 然后遍历
dynamicFieldTypes,留下那些id不在这个Set里的元素。
代码示例(Java 8+)
// 第一步:收集已存在的type的id集合 Set<Long> existingTypeIds = dynamicFields.stream() .map(DynamicFields::getType) .filter(Objects::nonNull) // 防止type为null导致空指针 .map(MDynamicFieldTypes::getId) .collect(Collectors.toSet()); // 第二步:过滤出未包含的type List<MDynamicFieldTypes> notContaining = dynamicFieldTypes.stream() .filter(type -> !existingTypeIds.contains(type.getId())) .collect(Collectors.toList());
测试你的示例输入
用你给的测试数据跑的话:
existingTypeIds会得到{1, 3}- 最终
notContaining就是你想要的:[{id=2,category="B",code=a2,text="bbbb"},{id=4,category="C",code=a4,text="cccc"}]
额外补充
- 如果你已经给
MDynamicFieldTypes重写了equals()和hashCode()(比如基于id),也可以直接对比对象,但用id判断更稳妥——毕竟有时候两个对象属性相同但引用不同,会被误判为不同。 - 要是项目还没升级到Java 8,用传统循环也能实现:
Set<Long> existingTypeIds = new HashSet<>(); for (DynamicFields df : dynamicFields) { if (df.getType() != null) { existingTypeIds.add(df.getType().getId()); } } List<MDynamicFieldTypes> notContaining = new ArrayList<>(); for (MDynamicFieldTypes type : dynamicFieldTypes) { if (!existingTypeIds.contains(type.getId())) { notContaining.add(type); } }
内容的提问来源于stack exchange,提问作者Buddhika Prasadh
相关产品推荐
相关产品推荐

