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

使用Java8流按枚举参数对列表中的项进行排序,java,java-8,java-stream,groupingby,Java,Java 8,Java Stream,Groupingby,假设我有一个墙列表listOfWalls,并且每个墙对象都有以下层次结构: wall -> wallType -> wallEntry(list of wall materials ) -> wallMaterial -> wallMaterialType(enum type), 所以为了得到这个列表中一些墙的wallMaterialType,我想 wall.getWallType().getWallEntry().getWallMaterial().getWallM

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

wall -> wallType -> wallEntry(list of wall materials ) -> wallMaterial -> wallMaterialType(enum type), 
所以为了得到这个列表中一些墙的wallMaterialType,我想

wall.getWallType().getWallEntry().getWallMaterial().getWallMaterialType();
现在,类Wall还具有以下参数:
width
height
这两个参数相乘,通过从Wall类调用我的函数
getwallerea()
得到墙的面积

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

  • 墙1,包括以下墙体材料类型:砖、灰泥、木材和35平方米的瓦砾
  • 墙2,采用以下墙体材料类型:干草、灰泥和瓦拉(105平方米)
  • 现在我想要的输出是:

    砖块:35平方米。 石膏:140平方米。 木材:35平方米。 干草:105平方米。 到目前为止,我的代码看起来像这样,我在哪里为每个

     Map<WallType, Double> getIt = listOfWalls.stream()
                    .collect(groupingBy(Wall::getWallType, Collectors.summingDouble(Wall::getWallArea)));
    
    Map getIt=listOfWalls.stream()
    .collect(groupingBy(Wall::getWallType,收集器.summingDouble(Wall::getWallArea));
    

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

    您似乎希望通过
    WallMaterialType
    enum进行映射

    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 result=walls.stream()
    .flatMap(墙->墙.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,您将丢失墙的
    Wallerea
    ,因此,我将所有内容分组到一个
    flatMap
    步骤中,以返回墙材质类型和墙面积的贴图(简单的一对也可以)

    flatMap
    步骤返回
    WallMaterialType
    WallMaterialType
    所属的
    wallArea
    的简单映射)


    collect与您已经编写的类似。

    是否
    getWallMaterialType
    返回一个
    列表
    ?共享一些类将有助于尝试不让我们自己编写代码;)请尽量提供一份我认为你有正确的地图。请问如何以这种格式打印?或者如何在流管道中打印它?主要与Nittick的副本有关-
    wall.getWallType().getWallEntry().stream()
    应该足够了,因为
    wallEntry
    是一个墙材料列表。@user7我已经对您的答案进行了编辑,以获得可能的进一步澄清和解决方案。