正如标题所暗示的,我正在尝试groupingBy,根据对象的“能力级别”范围对对象列表进行分组。我对Java Stream API非常陌生,所以我不太了解如何使用它。我写的代码不能编译,我只是不确定原因,我想我有正确的想法,但它不工作。任何帮助都将不胜感激!你可以在下面找到我失败的尝试。
这是groupingBy尝试:
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中是不可能的。
发布于 2020-09-23 01:47:13
我建议将逻辑移动到定义范围的不同方法中。
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)));https://stackoverflow.com/questions/64014351
复制相似问题