使用Java8流按枚举参数对列表中的项进行排序
假设我有一个墙列表listOfWalls,并且每个墙对象都有以下层次结构:使用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
wall -> wallType -> wallEntry(list of wall materials ) -> wallMaterial -> wallMaterialType(enum type),
所以为了得到这个列表中一些墙的wallMaterialType,我想
wall.getWallType().getWallEntry().getWallMaterial().getWallMaterialType();
现在,类Wall还具有以下参数:width
和height
这两个参数相乘,通过从Wall类调用我的函数getwallerea()
得到墙的面积
我想要实现的是从计算的墙列表中获得所有墙材料类型的面积,因此,例如,假设我们有两面墙:
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我已经对您的答案进行了编辑,以获得可能的进一步澄清和解决方案。