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

