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
相关产品推荐
相关产品推荐

