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

如何不使用临时Map,通过Stream编辑对象列表并合并重复项?

问题

是否可以不创建临时Map,通过Stream编辑对象列表?

例如,我有一个Student类:

class Student{
private String name;
private int age;
} 

我还有一个Student列表:

Student st1 = new Student("Tom", 14);
Student st2 = new Student("Tom", 18);
Student st3 = new Student("Jack", 19);

期望输出如下:

finalList = [Student{name='Tom', age=32}, Student{name='Jack', age=19}]
可行解决方案

目前最简洁的实现是借助Collectors.toMap完成同名学生的年龄合并,再将Map的值转为列表:

List<Student> result = rawListStudents.stream()
    .collect(Collectors.toMap(Student::getName, Function.identity(), (v1, v2) -> new Student(v2.getName(), v1.getAge() + v2.getAge())))
    .values()
    .stream()
    .toList();

关于“不使用临时Map”的说明

Java原生Stream API里没有直接支持分组合并的终端操作,所以仅靠标准API的话,确实绕不开临时Map——毕竟要按name分组累计年龄,必须有一个键值结构来跟踪每个name对应的年龄总和。如果非要避免显式写出Map,你可以自定义Collector,但它内部还是会用到类似Map的容器存储中间状态;或者先按name排序再遍历合并,但这种写法代码更繁琐,可读性远不如用toMap的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 16:27:35