You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选不在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:00:17