使用 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 也有以下参数:width
和 height
通过调用我的函数 getWallArea()
从 Wall class.
我想要实现的是从计算的墙列表中获取所有 wallMaterialTypes 的面积,例如假设我们有 2 面墙:
- 具有以下 wallMaterialTypes 的墙 1:砖、石膏、木材和 35 平方米的 wallArea()。
- 具有以下 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 是 WallMaterialType
和 wallMaterialType
所属的 wallArea
的简单映射。
收集与您已经写的类似。
假设我有一个墙列表 listOfWalls 并且每个墙对象都具有以下层次结构:
wall -> wallType -> wallEntry(list of wall materials ) -> wallMaterial -> wallMaterialType(enum type),
所以为了获得此列表中某些墙的 wallMaterialType,我想
wall.getWallType().getWallEntry().getWallMaterial().getWallMaterialType();
现在 class Wall 也有以下参数:width
和 height
通过调用我的函数 getWallArea()
从 Wall class.
我想要实现的是从计算的墙列表中获取所有 wallMaterialTypes 的面积,例如假设我们有 2 面墙:
- 具有以下 wallMaterialTypes 的墙 1:砖、石膏、木材和 35 平方米的 wallArea()。
- 具有以下 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 是 WallMaterialType
和 wallMaterialType
所属的 wallArea
的简单映射。
收集与您已经写的类似。