首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Java 8 Stream API按范围分组

使用Java 8 Stream API按范围分组
EN

Stack Overflow用户
提问于 2020-09-23 00:56:15
回答 1查看 229关注 0票数 1

正如标题所暗示的,我正在尝试groupingBy,根据对象的“能力级别”范围对对象列表进行分组。我对Java Stream API非常陌生,所以我不太了解如何使用它。我写的代码不能编译,我只是不确定原因,我想我有正确的想法,但它不工作。任何帮助都将不胜感激!你可以在下面找到我失败的尝试。

这是groupingBy尝试:

代码语言:javascript
运行
复制
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;}
        }
));

这是我的枚举:

代码语言:javascript
运行
复制
enum salaryRanges { 
    LOWER, MIDDLE, UPPER
}   

PS:我试着看看我是否可以做一个带范围的枚举,但从我读到的内容来看,这在Java中是不可能的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-23 01:47:13

我建议将逻辑移动到定义范围的不同方法中。

代码语言:javascript
运行
复制
   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

代码语言:javascript
运行
复制
  Map<salaryRanges,List<Employee>> res = list.stream()
            .collect(Collectors.groupingBy(JavaMain::getRange));

您还可以按照@Andreas建议的另一种方式完成此操作,即将定义工资范围逻辑移到枚举中

代码语言:javascript
运行
复制
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表达式调用该方法

代码语言:javascript
运行
复制
 Map<salaryRanges,List<Employee>> res = list.stream()
            .collect(Collectors.groupingBy(emp->salaryRanges.fromPowerLevel(emp.powerLevel)));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64014351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档