Java中自定义类对象列表去重并合并指定属性值的实现
按员工ID去重并合并薪酬的实现方案
我定义了如下Employee类:
class Employee { private final String id; private float compensation; public Employee(String id, float compensation) { this.id = id; this.compensation = compensation; } public String getId() { return id; } public float getCompensation() { return compensation; } }
同时拥有一个员工对象列表:
List<Employee> payment = Arrays.asList( new Employee("1", 3000.00f), new Employee("1", 6000.00f), new Employee("2", 5000.00f), new Employee("3", 4000.00f), );
需要对该列表按员工ID去重,并合并对应compensation属性的值,预期结果如下:
List<Employee> newPayment = Arrays.asList( new Employee("1", 9000.00f), new Employee("2", 5000.00f), new Employee("3", 4000.00f), );
方法一:使用Java 8 Stream API(推荐)
利用流式API的分组和汇总能力,实现简洁高效的处理:
List<Employee> newPayment = payment.stream() // 按员工ID分组,键为ID,值为对应员工对象集合 .collect(Collectors.groupingBy(Employee::getId)) .entrySet() .stream() // 对每组员工的薪酬求和,创建新的Employee实例 .map(entry -> new Employee( entry.getKey(), entry.getValue().stream() .mapToFloat(Employee::getCompensation) .sum())) .collect(Collectors.toList());
方法二:传统循环遍历方式
适用于不支持Java 8+的项目,通过HashMap实现分组累加:
// 先按ID分组累加薪酬 Map<String, Float> idCompSumMap = new HashMap<>(); for (Employee emp : payment) { String empId = emp.getId(); // 已存在则累加,不存在则初始化 idCompSumMap.put(empId, idCompSumMap.getOrDefault(empId, 0.0f) + emp.getCompensation()); } // 将Map转换为目标Employee列表 List<Employee> newPayment = new ArrayList<>(); for (Map.Entry<String, Float> entry : idCompSumMap.entrySet()) { newPayment.add(new Employee(entry.getKey(), entry.getValue())); }
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

