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

如何用Java 8更简洁地合并List中同一客户的两个对象?

问题解答

简洁实现方案

针对你需要合并同一客户的两个对象、保留完整属性的需求,这里提供两种更符合Java 8风格的简洁实现:

方案1:针对固定两个对象的reduce简化处理

如果确定每个分组内最多只有两个Customer对象,可以用Stream的reduce操作直接合并,替代原有的索引访问逻辑:

Customer mergedCustomer = list.stream()
    .reduce((c1, c2) -> {
        if (StringUtils.hasLength(c2.getID())) c1.setID(c2.getID());
        if (BigDecimal.ZERO.compareTo(c2.getCreditAmount()) != 0) c1.setCreditAmount(c2.getCreditAmount());
        // 其他需要合并的属性可在此添加规则
        return c1;
    })
    .orElseThrow(() -> new IllegalArgumentException("客户列表为空"));

processedChargeTransactions.add(mergedCustomer);

方案2:通用分组合并(支持任意数量同客户对象)

如果后续可能出现多个同客户的对象,推荐用Collectors.toMap按客户唯一标识分组并自动合并,扩展性更强:

// 假设Customer有唯一标识方法getUniqueKey()(比如手机号、客户编号等)
Map<String, Customer> mergedMap = list.stream()
    .collect(Collectors.toMap(
        Customer::getUniqueKey,
        Function.identity(),
        (existing, newCustomer) -> {
            if (StringUtils.hasLength(newCustomer.getID())) existing.setID(newCustomer.getID());
            if (BigDecimal.ZERO.compareTo(newCustomer.getCreditAmount()) != 0) existing.setCreditAmount(newCustomer.getCreditAmount());
            return existing;
        }
    ));

// 转换为最终列表
List<Customer> processedList = new ArrayList<>(mergedMap.values());

无副作用优化(可选)

如果不想修改原列表中的对象,可以在合并时创建新的Customer实例,避免对原数据产生影响:

Customer mergedCustomer = list.stream()
    .reduce(new Customer(), (result, current) -> {
        if (StringUtils.hasLength(current.getID())) result.setID(current.getID());
        if (BigDecimal.ZERO.compareTo(current.getCreditAmount()) != 0) result.setCreditAmount(current.getCreditAmount());
        return result;
    });

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 19:41:06