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

Java嵌套forEach遍历过滤嵌套列表结果数量异常问题排查

问题根因

你的代码返回结果不符合预期,是3个核心逻辑错误导致的:

  • 逻辑关系不符合需求:需求是Durable、Agile两个属性同时为true(逻辑与关系),但代码判断分支用了||(逻辑或),只要任意一个技能名匹配就进入状态判断,完全没有校验两个属性必须同时成立。
  • 内层遍历的添加逻辑错误:你在遍历单个英雄的power属性列表时,只要某一个power项满足「技能名匹配+状态为true」就直接把当前英雄加入结果集,根本不检查另一个技能的状态。比如示例中的Pudge,Durable状态为true、Agile状态为false,遍历到Durable项时就会被误加入结果集。
  • 重复添加元素:对于两个属性都为true的英雄,内层遍历会命中两次判断分支,导致同一个英雄被重复加入结果集。误判+重复添加共同导致最终结果数远大于预期的2条。

另外你代码中new ArrayList<>;存在语法错误,正确实例化写法是new ArrayList<>();,漏了构造方法的括号。

修复方案

不要在内层遍历里直接添加元素,应该先对单个英雄做两个属性的状态校验,确认两个属性都为true时,再把英雄加入结果集,从根源上避免重复添加和误判。

普通循环实现

List<Hero> filteredList = new ArrayList<>();
for (Hero hero : data.getHeroList()) {
    boolean isDurable = false;
    boolean isAgile = false;
    for (Power power : hero.getpower()) {
        if ("Durable".equals(power.getSkill())) {
            isDurable = power.getStatus();
        }
        if ("Agile".equals(power.getSkill())) {
            isAgile = power.getStatus();
        }
    }
    // 两个属性同时为true才加入结果
    if (isDurable && isAgile) {
        filteredList.add(hero);
    }
}

Stream流实现(更简洁)

List<Hero> filteredList = data.getHeroList().stream()
    .filter(hero -> {
        Map<String, Boolean> powerMap = hero.getpower().stream()
            .collect(Collectors.toMap(Power::getSkill, Power::getStatus));
        return Boolean.TRUE.equals(powerMap.get("Durable")) 
            && Boolean.TRUE.equals(powerMap.get("Agile"));
    })
    .collect(Collectors.toList());

注意:用equals精确匹配技能名比contains更严谨,避免存在名称包含目标字符串但实际不是目标技能的情况导致误判。

内容的提问来源于stack exchange,提问作者Dean Winchester

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 08:27:20