如何用Stream API计算每个Order中Element的size总和并生成映射
解决方法:用Stream API生成Order到size总和的Map
你的问题出在使用了flatMap,它把所有订单的Element都合并成了一个流,导致最后只能计算所有元素的总size,无法关联到单个Order对象。
要实现每个Order对应其元素size总和的Map,你需要保留每个Order的上下文,用Collectors.toMap来收集结果:
正确代码实现
private static Map<Order, Integer> calculate(List<Order> orders) { return orders.stream() .collect(Collectors.toMap( // 键:直接使用Order对象本身 order -> order, // 值:计算当前Order下所有Element的size总和 order -> order.getElements().stream() .mapToInt(Element::getSize) .sum() )); }
代码说明
- 不需要
flatMap,直接遍历每个Order对象,保留订单的上下文关联 Collectors.toMap的第一个参数指定Map的键为Order对象- 第二个参数对当前
Order的elements流做聚合计算:mapToInt(Element::getSize)把每个Element转换为对应的size数值sum()计算该订单所有元素的size总和
注意事项
确保你的Order类正确重写了equals()和hashCode()方法。因为Map的键依赖这两个方法判断对象是否相等,如果没有重写,不同引用但内容一致的Order会被视为不同的键,导致Map出现不符合预期的条目。
按照这段代码,你的示例会生成预期的{order1=75, order2=30}结果。
内容的提问来源于stack exchange,提问作者jackeylove271
相关产品推荐
相关产品推荐

