如何解决使用Java 8 Stream API按范围分组
正如标题所暗示的,我正在尝试通过按对象的“功率水平”范围对对象列表进行分组。我对Java Stream API还是很陌生,所以我不太了解如何解决它。我编写的代码无法编译,我不确定为什么,我认为我有正确的主意,但无法正常工作。任何帮助将不胜感激!您可以在下面找到我的失败尝试。
这是尝试分组
Map<BigDecimal,List<Employee>> ranges = ObjectList.stream().collect(Collectors.groupingBy(a -> {
if(a.powerLevel < 2500) { a.powerLevel = LOWER;}
else if(a.powerLevel >10000) {a.powerLevel = UPPER;}
else {a.PowerLevel = MIDDLE;}
}
));
这是我的枚举
enum salaryRanges{
LOWER,MIDDLE,UPPER
}
PS:我试图查看是否可以使用范围进行枚举,但是据我了解,在Java中是不可能的。
解决方法
我建议将逻辑移到定义范围的其他方法中
public static salaryRanges getRange(Employee employee) {
if(employee.powerLevel < 2500){
return salaryRanges.LOWER;
}
if(employee.powerLevel > 10000){
return salaryRanges.UPPER;
}
return salaryRanges.MIDDLE;
}
然后使用Collectors.groupingBy
Map<salaryRanges,List<Employee>> res = list.stream()
.collect(Collectors.groupingBy(JavaMain::getRange));
您也可以按照@Andreas的建议,通过将定义薪资范围逻辑移到枚举中来完成
enum salaryRanges {
LOWER,MIDDLE,UPPER
public static salaryRanges fromPowerLevel(int powerLevel){
if(powerLevel<2500){
return salaryRanges.LOWER;
}
if(powerLevel>10000){
return salaryRanges.UPPER;
}
return salaryRanges.MIDDLE;
}
}
然后使用lambda表达式调用该方法
Map<salaryRanges,List<Employee>> res = list.stream()
.collect(Collectors.groupingBy(emp->salaryRanges.fromPowerLevel(emp.powerLevel)));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。