java list集合stream流某一个字段分组
时间: 2025-04-16 22:44:52 浏览: 53
### 使用Java Stream API按字段对列表进行分组并收集到映射
为了实现基于对象某个字段的分组操作并将结果收集至`Map`,可以利用`Collectors.groupingBy()`方法。此方法允许指定分类函数作为参数来定义分组依据[^1]。
下面是一个具体的例子,假设有一个名为`Employee`的对象类,其中包含员工的名字(`name`)、部门(`dept`)以及工资(`salary`)属性:
```java
import java.util.*;
import java.util.stream.Collectors;
class Employee {
private String name;
private String dept;
private double salary;
public Employee(String name, String dept, double salary) {
this.name = name;
this.dept = dept;
this.salary = salary;
}
// Getters...
@Override
public String toString() {
return "Employee{name='" + name + "', dept='" + dept + "', salary=" + salary + '}';
}
}
public class Main {
public static void main(String[] args) {
List<Employee> employees = Arrays.asList(
new Employee("Alice", "HR", 7000),
new Employee("Bob", "Engineering", 9000),
new Employee("Charlie", "HR", 6500)
);
Map<String, DoubleSummaryStatistics> result =
employees.stream()
.collect(Collectors.groupingBy(Employee::getDept,
Collectors.summarizingDouble(Employee::getSalary)));
System.out.println(result);
}
}
```
上述代码展示了如何通过`groupingBy`按照部门名称分组,并且对于每一个分组计算该部门内所有成员薪资的相关统计信息(如平均数、总数等),这里使用的是`summarizingDouble`收集器。
如果目标是在分组的同时执行多种聚合运算,则可以通过嵌套收集器的方式完成。例如,在同一个分组下既求得某字段之和又获取其均值:
```java
Map<String, Tuple<Double, Double>> complexResult =
employees.stream()
.collect(Collectors.groupingBy(Employee::getDept,
Collectors.collectingAndThen(
Collectors.teeing(
Collectors.summingDouble(Employee::getSalary),
Collectors.averagingDouble(Employee::getSalary),
(total, avg) -> new Tuple<>(total, avg))
)
));
```
在这个复杂版本的例子中,引入了一个自定义的二元组(Tuple)用于存储两个不同类型的聚合结果——总和与平均值。需要注意的是,实际项目里可能需要创建这样的辅助类或采用其他形式的数据结构来容纳多维度的结果数据。
阅读全文
相关推荐


















