假设我们有一个员工列表,其中包含他们的部门和薪水,我们想要每个部门支付的总薪水。
有几种方法可以做到这一点,例如,您可以使用toMap 收集器来汇总每个部门的数据:
- 第一个参数是键映射器(您的聚合轴 = 部门),
- 第二个是值映射器(您要聚合的数据 = 薪水),并且
- 第三个是合并功能(您希望如何聚合数据 = 对值求和)。
例子:
import static java.util.stream.Collectors.*;
public static void main(String[] args) {
List<Person> persons = Arrays.asList(new Person("John", "Sales", 10000),
new Person("Helena", "Sales", 10000),
new Person("Somebody", "Marketing", 15000));
Map<String, Double> salaryByDepartment = persons.stream()
.collect(toMap(Person::department, Person::salary, (s1, s2) -> s1 + s2));
System.out.println("salary by department = " + salaryByDepartment);
}
与流一样,有几种方法可以获得所需的结果,例如:
import static java.util.stream.Collectors.*;
Map<String, Double> salaryByDepartment = persons.stream()
.collect(groupingBy(Person::department, summingDouble(Person::salary)));
Person 类供参考:
static class Person {
private final String name, department;
private final double salary;
public Person(String name, String department, double salary) {
this.name = name;
this.department = department;
this.salary = salary;
}
public String name() { return name; }
public String department() { return department; }
public double salary() { return salary; }
}