如何用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
相关产品推荐
相关产品推荐

