按范围分组 Java 8 Stream API
Grouping by ranges with Java 8 Stream API
正如标题所暗示的,我试图通过 groupingBy 将 objects 的列表按其“功率级别”范围分组。我是 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.
中是不可能的
我建议将逻辑移动到定义范围的不同方法中
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)));
正如标题所暗示的,我试图通过 groupingBy 将 objects 的列表按其“功率级别”范围分组。我是 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.
中是不可能的我建议将逻辑移动到定义范围的不同方法中
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)));