Java:多个List相同字段合并求和的实现

在Java开发中,处理集合(如List)的场景非常常见。尤其是在需要对多个List进行合并并对某些字段进行求和的时候,能够高效地完成操作是非常重要的。本文将通过示例演示如何实现多个List合并相同字段求和的功能。

背景知识

在业务系统中,常常会遇到需要对不同来源的数据进行合并的场景。例如,我们可能从不同的销售渠道获取销售数据,每个渠道的销售记录都有相关的字段,例如产品ID和销售额。我们的目标是将这些数据合并并计算总销售额。

基本概念

假设我们有两个List,分别存储了不同来源的销售记录。每条记录都包含一个productId和对应的salesAmount,我们需要将这些销售记录按照productId合并,并求每个产品的总销售额。

代码示例

下面是一个简单的实现示例:

import java.util.*;

class SaleRecord {
    private String productId;
    private double salesAmount;

    public SaleRecord(String productId, double salesAmount) {
        this.productId = productId;
        this.salesAmount = salesAmount;
    }

    public String getProductId() {
        return productId;
    }

    public double getSalesAmount() {
        return salesAmount;
    }
    
    @Override
    public String toString() {
        return "Product ID: " + productId + ", Total Sales: " + salesAmount;
    }
}

public class SalesAggregator {
    public static void main(String[] args) {
        List<SaleRecord> list1 = Arrays.asList(
            new SaleRecord("A001", 100.0),
            new SaleRecord("A002", 150.0)
        );
        
        List<SaleRecord> list2 = Arrays.asList(
            new SaleRecord("A001", 200.0),
            new SaleRecord("A003", 300.0)
        );
        
        List<SaleRecord> mergedRecords = mergeAndSumSales(list1, list2);
        
        // 输出结果
        for (SaleRecord record : mergedRecords) {
            System.out.println(record);
        }
    }

    public static List<SaleRecord> mergeAndSumSales(List<SaleRecord> list1, List<SaleRecord> list2) {
        Map<String, Double> salesMap = new HashMap<>();

        // 处理第一个List
        for (SaleRecord record : list1) {
            salesMap.put(record.getProductId(), salesMap.getOrDefault(record.getProductId(), 0.0) + record.getSalesAmount());
        }

        // 处理第二个List
        for (SaleRecord record : list2) {
            salesMap.put(record.getProductId(), salesMap.getOrDefault(record.getProductId(), 0.0) + record.getSalesAmount());
        }

        // 将结果转换为List
        List<SaleRecord> result = new ArrayList<>();
        for (Map.Entry<String, Double> entry : salesMap.entrySet()) {
            result.add(new SaleRecord(entry.getKey(), entry.getValue()));
        }

        return result;
    }
}

代码解析

上述代码实现了一个SaleRecord类,用于存储销售记录。SalesAggregator类中,mergeAndSumSales方法接收两个List类型的参数,并通过一个Map来记录每个产品的总销售额。

  1. 初始化Map:使用Map<String, Double>来存储每个productId及其销售额的累计值。
  2. 遍历List:分别遍历两个List,使用MapgetOrDefault方法帮助我们简化判断逻辑。
  3. 转换为List:最终将结果转换回List并返回。

总结

通过以上的示例,我们可以看到在Java中使用Map进行数据合并和求和的方式十分高效。该方法不仅简化了代码逻辑,还提高了代码的可读性和可维护性。这种技术在数据处理、报表生成等场景中应用广泛。如果你在项目中需要对集合数据进行求和或合并,不妨尝试这种方法来提高工作效率。