Java中removeIf条件未按预期生效,无法删除Plan下对应Tariff如何修复
问题修复方案
原代码核心问题
- 变量作用域错误:
remove变量定义在Plan循环外,只要任意一个Plan下存在code为"N"的Tariff,变量值就会被永久修改为"N",后续所有Plan的判断都会复用这个被污染的值,无法独立判断每个Plan的删除条件 - 删除逻辑写反:
removeIf方法会删除所有符合判断条件的元素,你的需求是remove等于"N"时删除所有Tariff,但原代码的判断条件写的是remove.equals("Y"),完全和需求相反 - 冗余拷贝:遍历单个Plan的Tariff列表时不需要新建ArrayList拷贝原有列表,直接遍历原列表即可
- 额外变量异常:你提到调试时
remove显示为"T",需要检查代码中未展示的部分是否有其他逻辑修改了remove变量的取值,按你贴出的代码remove只会出现"Y"或"N"两种值
修复后代码
List<Plan> plan = new ArrayList<>(); plan.addAll(plan2); for (int i = 0; i < plan.size(); i++) { // 每个Plan单独初始化remove变量,避免值污染 String remove = "Y"; List<Tariff> tariffList = plan.get(i).getTariff(); for (Tariff tariff : tariffList) { if (tariff.getCode().equals("N")) { remove = "N"; // 只要找到一个符合条件的就可以跳出循环,不需要继续遍历 break; } } // 修改判断条件,remove等于"N"时删除所有Tariff tariffList.removeIf(condition -> remove.equals("N")); }
可选简化写法(Java 8+)
确定要删除所有Tariff的场景下,直接调用clear()方法比removeIf效率更高:
List<Plan> plan = new ArrayList<>(plan2); plan.forEach(p -> { boolean needRemove = p.getTariff().stream() .anyMatch(tariff -> "N".equals(tariff.getCode())); if (needRemove) { p.getTariff().clear(); } });
内容的提问来源于stack exchange,提问作者Deividas.r
相关产品推荐
相关产品推荐

