有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

所以为了得到这个列表中某一面墙的wallMaterialType,我想

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

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

我想要实现的是从计算的墙列表中获得所有墙材料类型的面积,因此,例如,假设我们有两面墙:

  1. 墙1,包括以下墙体材料类型:砖、灰泥、木材和35平方米的瓦莱拉(Wallerea)
  2. 2号墙,墙体材料类型如下:干草、灰泥和瓦莱拉(105平方米)

现在我想要的是:

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) 个答案

  1. # 1 楼答案

    似乎您希望通过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,你将失去墙的wallArea。因此,我将所有内容分组到一个flatMap步骤中,以返回墙材质类型和墙面积的贴图(简单的一对也可以)

    (步骤flatMap返回WallMaterialTypewallArea所属wallMaterialType的简单映射)

    收集的内容与你已经写过的内容类似