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

如何筛选不在DynamicFields.type列表中的MDynamicFieldTypes对象

如何用一个对象列表过滤另一个对象列表?

Hey,这个需求很常见,用Java的Stream API就能优雅解决。先理清楚核心逻辑:我们要从dynamicFieldTypes里挑出那些没在dynamicFields的type属性里出现过的MDynamicFieldTypes对象,判断的关键是用唯一标识(比如id,毕竟对象引用可能不同但实际是同一个类型)。

实现步骤

  1. 先把dynamicFields里所有type的id提取出来,存到一个Set里——集合的存在性判断比列表快得多,适合做这类过滤。
  2. 然后遍历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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:54:06