如何筛选不在DynamicFields.type中的MDynamicFieldTypes对象
筛选出未在另一个对象数组中出现的元素
你想要从dynamicFieldTypes列表里找出那些没有出现在dynamicFields的type属性集合中的MDynamicFieldTypes对象对吧?结合你给出的实体类和示例输入,我给你分享几种实用的实现方案:
核心思路
首先提取dynamicFields中所有已存在的MDynamicFieldTypes的唯一标识(比如主键id,这是最可靠的判断依据),存入一个Set(保证查找效率),然后用这个集合去过滤dynamicFieldTypes,留下不在集合里的元素。
Java 8+ Stream API实现(推荐)
这种写法简洁高效,是现在Java开发的主流方式:
import java.util.Set; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; // 第一步:提取dynamicFields中已存在的type的id集合 Set<Long> existingTypeIds = dynamicFields.stream() .map(DynamicFields::getType) .filter(Objects::nonNull) // 避免type为null的空指针问题 .map(MDynamicFieldTypes::getId) .collect(Collectors.toSet()); // 第二步:过滤dynamicFieldTypes,得到未出现的元素 List<MDynamicFieldTypes> notContaining = dynamicFieldTypes.stream() .filter(type -> !existingTypeIds.contains(type.getId())) .collect(Collectors.toList());
补充说明
- 这里用
id判断是因为主键是实体的唯一标识,比直接比较对象更可靠。如果你的业务需要用其他字段(比如code)来判断,只需要把map(MDynamicFieldTypes::getId)改成map(MDynamicFieldTypes::getCode)即可。 - 如果你的
MDynamicFieldTypes已经正确重写了equals()和hashCode()方法,也可以直接收集type对象到Set,然后用!existingTypes.contains(type)过滤,但用主键的方式兼容性更强。
Java 7及以下传统循环实现
如果项目还在使用低版本Java,可以用传统的循环写法:
import java.util.Set; import java.util.List; import java.util.HashSet; import java.util.ArrayList; // 第一步:提取已存在的type的id集合 Set<Long> existingTypeIds = new HashSet<>(); for (DynamicFields df : dynamicFields) { MDynamicFieldTypes type = df.getType(); if (type != null) { existingTypeIds.add(type.getId()); } } // 第二步:过滤得到目标列表 List<MDynamicFieldTypes> notContaining = new ArrayList<>(); for (MDynamicFieldTypes type : dynamicFieldTypes) { if (!existingTypeIds.contains(type.getId())) { notContaining.add(type); } }
内容的提问来源于stack exchange,提问作者Buddhika Prasadh
相关产品推荐
相关产品推荐

