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

如何用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()
        ));
}

代码说明

  1. 不需要flatMap,直接遍历每个Order对象,保留订单的上下文关联
  2. Collectors.toMap的第一个参数指定Map的键为Order对象
  3. 第二个参数对当前Order的elements流做聚合计算:
    • mapToInt(Element::getSize)把每个Element转换为对应的size数值
    • sum()计算该订单所有元素的size总和

注意事项

确保你的Order类正确重写了equals()和hashCode()方法。因为Map的键依赖这两个方法判断对象是否相等,如果没有重写,不同引用但内容一致的Order会被视为不同的键,导致Map出现不符合预期的条目。

按照这段代码,你的示例会生成预期的{order1=75, order2=30}结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:43:22