Java Lambda处理列表报错:getCostChangeDtl返回List后语法错误修复咨询
代码问题修复方案
错误根因
原有代码报错的核心原因有两点:
getCostChangeDtl返回值改为List<CostChangeDtl>后,map操作输出的流元素类型变为List<CostChangeDtl>,后续filter逻辑直接对List类型调用getItemID()方法,该方法不存在因此编译报错。- 即使过滤逻辑不报错,
collect最终得到的是List<List<CostChangeDtl>>,和addAll方法要求的入参类型Collection<? extends CostChangeDtl>不匹配,也会抛出类型异常。
修复方案
使用flatMap替代map操作,将每个item对应的List<CostChangeDtl>扁平化拆解为单个CostChangeDtl元素的流,完全适配后续的过滤、收集逻辑。
修复后完整代码如下:
costChangeDetails.forEach( costChangeDetail -> changeDtls.addAll(costChangeDetail.getItems().stream().flatMap(item -> { List<CostChangeDtl> despCostChangeDtlList = getCostChangeDtl(ccd, costChangeDetail, item, metrics); for (CostChangeDtl costChangeDtl : despCostChangeDtlList) { if (costChangeDtl.getItemID() == null) { String consumerGtin = item.item.getConsumerDetails().getConsumerGtin(); missingSkuGtins.add(format("%s | %s ", consumerGtin, costChangeDetail.getLocation().getId())); } } return despCostChangeDtlList.stream(); }).filter(costChangeDtl -> costChangeDtl.getItemID() != null) .collect(Collectors.toList())) );
改动说明
- 替换
map为flatMap,将List类型返回值拆解为单个元素的流,保证流操作的元素始终为CostChangeDtl类型 - 调整变量名避免歧义,
filter逻辑直接对单个CostChangeDtl对象操作,类型完全匹配 - 最终收集得到的
List<CostChangeDtl>符合addAll方法的入参要求,不会出现类型不兼容问题
内容的提问来源于stack exchange,提问作者Deepjyoti De
相关产品推荐
相关产品推荐

