当前位置: 首页 > 知识库问答 >
问题:

使用Java8流按枚举参数对列表中的项进行排序

林夕
2023-03-14

假设我有一个walls列表listOfWalls,并且每个wall对象具有以下层次结构:

wall -> wallType -> wallEntry(list of wall materials ) -> wallMaterial -> wallMaterialType(enum type), 

所以为了在这个列表中获得一些墙的wallMaterialType,我会这样做

wall.getWallType().getWallEntry().getWallMaterial().getWallMaterialType();
    null
BRICK: 35 square meters.
Plaster: 140 square meters.
Wood: 35 square meters.
Hay: 105 square meters.
 Map<WallType, Double> getIt = listOfWalls.stream()
                .collect(groupingBy(Wall::getWallType, Collectors.summingDouble(Wall::getWallArea)));

从那里我不知道该怎么走?感谢帮助。

共有1个答案

姬高扬
2023-03-14

您似乎希望通过WallMaterialType枚举进行映射。

Map<WallMaterialType, Double> result = walls.stream()
            .flatMap(wall -> wall.getWallType().getWallEntry().getWallMaterials()
                    .stream()
                    .map(wallMaterial -> new AbstractMap.SimpleEntry<>(wallMaterial.getWallMaterialType(),
                            wall.getWallArea())))
            .collect(Collectors.groupingBy(AbstractMap.SimpleEntry::getKey,
                    Collectors.summingDouble(AbstractMap.SimpleEntry::getValue)));

如果您一直调用map(..)并到达WallMaterials,您将丢失墙的Wallare。因此,我将所有内容分组到一个Flatmap步骤中,以返回墙材料类型和墙面积的映射(简单对也可以)。

(FlatMap步骤返回WallMaterialTypeWallMaterialType所属的WallArea的简单映射)。

收藏品与你已经写的相似。

 类似资料:
  • 问题内容: 我的清单包含大小等的集合。我尝试这样做,但似乎不起作用。 我想要的最终结果是。 我可以尝试添加在所有的元素和那种出来再做出新的的。但是,有某种班轮吗? 更新: 这可行,但是可以简化吗? 问题答案: @Eugene的回答很甜蜜,因为番石榴很甜。但是,如果您碰巧在类路径中没有番石榴,这是另一种方式: 首先,我将所有集合映射到一个流中,然后对所有元素进行排序,最后,将整个排序后的流收集到集合

  • 我有一个产品类: 如果group是一个单独的字段,就像name一样,我可以这样做: 如何使用? 预期的结果如下所示,对于productList中存在的每个组,映射到在其字段中具有该组的产品列表

  • 我对从流中排序列表感兴趣。这是我正在使用的代码: 我是不是漏了什么?之后不会对列表进行排序。 它应该根据最低值的项目对列表进行排序。 以及打印方法:

  • 但我得到一条错误消息,说无法在原语类型int上调用compareToIgnoreCase(int) 我如何修复这段代码,使它能够用整数值对列表进行排序?

  • 我有一个这样的方法: 此方法需要以如下字符串形式返回3个最昂贵项目的产品ID:“item1,item2,item3”。我应该只能使用溪流,我被困在这里了。我应该能够按值对项目进行排序,然后获得产品ID,但我似乎无法使其正常工作。 编辑: 产品ID位于入口类中

  • 我有一个包含甲板排名的枚举。我将这些排名添加到一个数组中。当我使用Arrays.sort使用自定义比较器对数组进行排序时,它没有排序,而是返回了这个: 有什么建议吗?谢谢 下面是代码: