这是一个示例场景:
假设我们有这样的员工记录:
name, age, salary (in 1000 dollars)
a, 20, 50
b, 22, 53
c, 34, 79
等等。目标是计算不同年龄组(例如 21 至 30 岁和 31 至 40 岁等)的平均工资。
我想使用 stream
来完成此操作,但我无法理解我需要如何使用 groupingBy
来完成此操作。我在想也许我需要定义某种元组年龄范围。有什么想法吗?
最佳答案
下面的代码应该给你你正在寻找的东西。关键是支持分组的“Collectors”类。
Map<Double,Integer> ageGroup= employees.stream().collect(Collectors.groupingBy(e->Math.ceil(e.age/10.0),Collectors.summingInt(e->e.salary)));
插图假设工资是整数但很容易转换成双倍
完整的程序是这样的
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Employee> employees = new ArrayList<>();
employees.add(new Employee("a",20,100));
employees.add(new Employee("a",21,100));
employees.add(new Employee("a",35,100));
employees.add(new Employee("a",32,100));
Map<Double,Integer> ageGroup= employees.stream().collect(Collectors.groupingBy(e->Math.ceil(e.age/10.0),Collectors.summingInt(e->e.salary)));
System.out.println(ageGroup);
}
public static class Employee {
public Employee(String name, int age, int salary) {
super();
this.name = name;
this.age = age;
this.salary = salary;
}
public String name;
public int age;
public int salary;
}
输出是
{4.0=200, 2.0=100, 3.0=100}
关于java - 如何使用流在 Java 8 中按值范围分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33536295/