java - 如何使用流在 Java 8 中按值范围分组

标签 java java-8

这是一个示例场景:

假设我们有这样的员工记录:

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/

相关文章:

Java : set a Component on top of another

java - 对齐不同DesignGridLayout的标签列

java - 通过java流计算二维数组中的邻居

java - 使用 Java Streams 从 Nested List 和 Outer List 收集数据

java - 为 Android 构建时,Unity 项目的 Gradle 构建失败

java - 如何以更高效的方式打印最大的数字? (Java初学者)

java - 如何为测试(junit)中的 block 设置超时?

java - 迭代和复制HashMap值的有效方法

java - 从 JDK 1.5.0_06 迁移到 1.8.0_66 - 替换已弃用的 Java JPEG 类

java - 基于复杂匹配键的多个属性分组和聚合