1

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

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

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

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

现在 Wall 类也有以下参数:通过从 Wall 类调用我的函数widthheight它们相乘得到墙的面积。getWallArea()

我想要实现的是从计算的墙壁列表中获取所有 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)));

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

4

1 回答 1

2

看来您想按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'swallArea因此,我将所有内容分组到一个flatMap步骤中以返回墙壁材料类型和墙壁面积的地图(简单的一对也可以)。

(该flatMap步骤返回 aWallMaterialTypewallAreathewallMaterialType所属的简单映射)。

该集合类似于您已经编写的内容。

于 2020-04-02T13:09:43.263 回答