list stream流分组,累加
时间: 2024-12-30 18:30:46 浏览: 6
### Java List Stream 分组与累加
对于 `List` 中的对象流 (`Stream`) 进行分组并对其特定字段进行累加操作,在Java中可以通过组合使用 `stream()` 方法以及 `Collectors` 类来完成。下面展示了一个具体的例子,该实例基于学生列表对学生按名字分组,并计算每组学生的身高总和。
```java
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
class Student {
private String name;
private BigDecimal stature;
// 构造函数、getter 和 setter 省略
@Override
public String toString() {
return "Student{name='" + name + "', stature=" + stature + "}";
}
}
public class Main {
public static void main(String[] args) {
List<Student> students = Arrays.asList(
new Student("张三", new BigDecimal("180")),
new Student("李四", new BigDecimal("175")),
new Student("王五", new BigDecimal("165")),
new Student("张三", new BigDecimal("190"))
);
Map<String, BigDecimal> sumOfHeightsPerName = students.stream()
.collect(Collectors.groupingBy(Student::getName,
Collectors.mapping(Student::getStature,
Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
System.out.println(sumOfHeightsPerName);
}
}
```
上述代码创建了一张映射表,其中键为学生的名字而值则代表对应姓名下所有学生的身高之和[^1]。这里采用的是 `groupingBy` 结合 `mapping` 及 `reducing` 的方式来达到目的;首先按照学生名称分组(`groupingBy`),接着将每个分组内的对象转换成其身高的集合(`mapping`),最后通过 `reducing` 对这些数值执行相加运算得到最终的结果。
阅读全文