首页 > 解决方案 > 使用 collectors.groupingby 修改过滤器方法

问题描述

我正在阅读 .txt 文件,然后尝试根据工资范围对员工进行分组。然后显示该组的员工人数和平均工资。到目前为止,我尝试的是使用 list.stream().filter 方法。但是,我需要使用 collectors.groupingBy、collectors.summarizingDouble() 和 collectors.average() 方法对它们进行分组。但我似乎做不到。这是我到目前为止所做
的,getSalary 方法:

public BigDecimal getSalary() {
        return Salary;
    }

驱动程序类:

  Map<Object, Long> avgSalary=
                         employee_list.stream().collect(Collectors.groupingBy(emp->emp.getSalary().doubleValue() < 30000, Collectors.counting()));
                                  
                         Set<Entry<Object, Long>> entrySet = avgSalary.entrySet();
                                  
                         for (Entry<Object, Long> entry : entrySet) 
                         {
                             System.out.println(entry.getKey()+" : "+entry.getValue());
                         }
 

我真的很感谢用collectors.groupuingBy()替换过滤器方法的一些帮助。输出可以是:
<30000:1:平均工资:23000
40000-50000:2:平均工资:44000

标签: javacollectors

解决方案


您应该Collectors.summarizingDouble清楚地使用和建立每个组:

Map<String, DoubleSummaryStatistics> result = employee_list.stream()
    .collect(Collectors.groupingBy(emp -> 
             emp.getSalary().doubleValue() < 30000 ?
                 "<30000" :
             emp.getSalary().doubleValue() < 40000 ?
                 "30000-40000" :
             emp.getSalary().doubleValue() < 50000 ?
                 "40000-50000" :
                 ">50000",
             Collectors.summarizingDouble(emp -> emp.getSalary().doubleValue())));

然后,只需按键访问每个组,即"40000-50000"获取其统计信息:

DoubleSummaryStatistics stats40k50k = result.get("40000-50000");

每个组的所有统计信息都收集到DoubleSummaryStatistics对象中,您可以从中获得平均值:

double avg40k50k = stats40k50k == null ? 0.0 : stats40k50k.getAverage();

推荐阅读