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

如何用Java 8实现匹配ID后更新Object1的total值

Java 8 实现:匹配ID并更新Object1的Total值

嘿,我来帮你搞定这个Java 8的实现,顺便给你优化下效率——原来的嵌套循环在数据量大的时候可不太友好哦~

高效实现方案(推荐)

先给你上完整代码,后面再拆解说明:

import java.util.Map;
import java.util.stream.Collectors;

// 第一步:把list2预处理成ID对应总求和的Map,避免重复遍历
Map<String, Integer> idToTotalSumMap = list2.stream()
    .collect(Collectors.toMap(
        Object2::getId, // 用Object2的id作为Map的key
        object2 -> object2.getList().stream()
            .mapToInt(Object3::getTotal) // 把Object3的total转成int流
            .sum() // 对当前Object2下的所有Object3的total求和
    ));

// 第二步:遍历list1,根据Map快速匹配并更新total
list1.forEach(object1 -> {
    // 没有匹配的ID就取0,避免空指针
    Integer matchedSum = idToTotalSumMap.getOrDefault(object1.getId(), 0);
    object1.setTotal(object1.getTotal() - matchedSum);
});

分步拆解

  • 预处理list2成Map:这一步把原来的嵌套遍历逻辑提前做了,时间复杂度从原来的O(n*m)降到了O(n+m),数据量越大,效率提升越明显。用Collectors.toMap()直接把每个Object2的id和它对应的list求和结果绑定在一起。
  • 更新list1的元素:用forEach()遍历每个Object1,通过getOrDefault()快速拿到对应id的求和值,直接计算并更新total,逻辑清晰又简洁。

补全你写的半完成代码(不推荐)

如果你想顺着自己写的Stream逻辑补全,也能实现,但效率和原来的嵌套循环差不多,适合小数据量场景:

list1.forEach(object1 -> {
    // 过滤出和当前Object1同ID的Object2,再flatMap取出所有Object3的total求和
    int sum = list2.stream()
        .filter(object2 -> object2.getId().equals(object1.getId()))
        .flatMapToInt(object2 -> object2.getList().stream().mapToInt(Object3::getTotal))
        .sum();
    object1.setTotal(object1.getTotal() - sum);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:17:09