java - 使用 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
解决方案
您应该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();
推荐阅读
- python - 为什么关闭标准输入文件描述符不会在 RPi 错误上运行?
- github - 致命:无法从远程存储库 Laravel Forge 读取
- jdbc - redshift/postgresql 中的 regexp_count 不支持设置模式值的动态参数
- python - 使用 MultibodyPlant,为什么我会得到 `SolveQuadraticForTheSmallestPositiveRoot(): condition 'Delta > 0' failed`?
- mongodb - Gatsby 是否支持 MongoDB 关系?
- php - RewriteRule url 后无法获取参数
- javascript - 在 ajax 无限加载脚本上出现 403 错误
- rust - 在 C++ 的`std::cin >>` 的 Rust 模拟中,我缺少什么极端情况?
- java - 如何将下拉值发送到 servlet 而不是选项文本
- c++ - CMake:尝试在 Jenkins Build Machine 上运行时出现“链接库”错误 (0xc0000135)