Collectors.groupingBy配合Collectors.collectingAndThen()的使用
时间: 2023-11-21 08:58:15 浏览: 104
`Collectors.groupingBy()`方法可以将流中的元素按照指定的条件分组,返回一个`Map`对象,其中键为分组条件,值为分组后的元素列表。而`Collectors.collectingAndThen()`方法可以对分组后的结果进行进一步的处理,例如对分组后的元素列表进行求和、求平均值等操作。
下面是一个示例代码,演示了如何使用`Collectors.groupingBy()`方法和`Collectors.collectingAndThen()`方法对一个`List`中的元素进行分组,并计算每个分组的平均值:
```java
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<Employee> employees = Arrays.asList(
new Employee("Alice", "IT", new BigDecimal("5000")),
new Employee("Bob", "IT", new BigDecimal("6000")),
new Employee("Charlie", "HR", new BigDecimal("7000")),
new Employee("David", "HR", new BigDecimal("8000"))
);
Map<String, Double> avgSalaryByDept = employees.stream()
.collect(Collectors.groupingBy(Employee::getDept,
Collectors.collectingAndThen(
Collectors.averagingDouble(e -> e.getSalary().doubleValue()),
avg -> BigDecimal.valueOf(avg).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue()
)
));
System.out.println(avgSalaryByDept);
}
}
class Employee {
private String name;
private String dept;
private BigDecimal salary;
public Employee(String name, String dept, BigDecimal salary) {
this.name = name;
this.dept = dept;
this.salary = salary;
}
public String getName() {
return name;
}
public String getDept() {
return dept;
}
public BigDecimal getSalary() {
return salary;
}
}
```
输出结果为:
```
{HR=7500.0, IT=5500.0}
```
上述代码中,首先定义了一个`Employee`类,其中包含了员工的姓名、部门和薪水信息。然后创建了一个包含了4个`Employee`对象的`List`。接着使用`Collectors.groupingBy()`方法对`employees`流进行分组,按照部门进行分组,并将每个部门的员工薪水求平均值。最后使用`Collectors.collectingAndThen()`方法对平均值进行处理,保留2位小数并转换为`Double`类型。最终得到了一个`Map`对象,其中键为部门名称,值为该部门员工薪水的平均值。
阅读全文