当前位置: 首页 > 面试题库 >

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

柯星华
2023-03-14
问题内容

这是一个示例方案:

想象一下,我们有如下员工记录:

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}


 类似资料:
  • 问题内容: 问题答案: Mysql作为关键字的分隔符使用反引号“`”,而不是方括号(例如sql server)

  • 问题内容: 假设有一个与此问题类似的情况。我想得到以下结果: 我可以使用选定的答案作为解决方案: 我如何确保即使在该范围内没有任何结果,也将显示30-39的分数范围? 问题答案: 尝试以下查询(也在SQL Fiddle上): 编辑: 您可以通过将参数更改为轻松调整范围。可以使用以下构造来确保始终覆盖您的分数: 对于CTE。

  • 问题内容: 我设法绘制了数据,并想为其添加背景图像(地图)。数据是按长/纬度值绘制的,我也具有图像三个角(左上角,右上角和左下角)的长/纬度值。 我试图弄清楚如何在imshow中使用’extent’选项。但是,我发现的示例并未说明如何为每个角指定x和y(在我的情况下,我具有三个角的信息)。 将图像添加到绘图中时,如何为图像指定三个角的位置? 谢谢 问题答案: 在当前轴的坐标中指定要粘贴图像的矩形的

  • 我想用“IntStream”来执行后范围。 所以,普通看起来像: 但是我需要,像这样: 如何实现?

  • 问题内容: 我正在尝试对此表进行查询: 我想获得输出: 我想得到那个结果,所以我会知道什么时候开始赚钱,什么时候停止钱。我还对开始花钱之前的月份数(这解释了第一行)以及停止钱的月份数(这解释了为什么我也对2013年7月至2013年8月的第三行感兴趣)感兴趣。 )。 我知道我可以在日期上使用min和max,在金额上使用sum,但是我不知道如何以这种方式划分记录。 谢谢! 问题答案: 这是一个主意(和

  • 感谢所有人!