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

Sorting by enum parameters items from a list using Java8 streams

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

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

所以为了获得此列表中某些墙的 wallMaterialType,我想

wall.getWallType().getWallEntry().getWallMaterial().getWallMaterialType();

现在 class Wall 也有以下参数:widthheight 通过调用我的函数 getWallArea() 从 Wall class.

我想要实现的是从计算的墙列表中获取所有 wallMaterialTypes 的面积,例如假设我们有 2 面墙:

  1. 具有以下 wallMaterialTypes 的墙 1:砖、石膏、木材和 35 平方米的 wallArea()。
  2. 具有以下 wallMaterialTypes 的墙 2:干草、石膏和 105 平方米的 wallArea()。

现在我想要的输出是:

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)));

从那里我不知道怎么走?帮助表示赞赏。

您似乎想通过 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,你将失去 Wall 的 wallArea 因此,我将所有内容组合成一个 flatMap 走到 return 墙 material 类型和墙面积的地图(简单的一对也可以)。

flatMap 步骤 return 是 WallMaterialTypewallMaterialType 所属的 wallArea 的简单映射。

收集与您已经写的类似。