Vamos supor que eu tenho uma lista de paredes listOfWalls e que cada objeto parede tem a seguinte hierarquia:
wall -> wallType -> wallEntry(list of wall materials ) -> wallMaterial -> wallMaterialType(enum type),
de modo a fim de obter wallMaterialType de alguma parede nesta lista, eu iria como
wall.getWallType().getWallEntry().getWallMaterial().getWallMaterialType();
Agora classe Wall também tem os seguintes parâmetros: width
e height
que multiplicados juntos recebe uma área da parede chamando minha função getWallArea()
de classe Wall.
O que eu gostaria de conseguir é fazer com que a área de todos os wallMaterialTypes de uma lista de paredes calculados, assim, por exemplo, vamos supor que temos 2 paredes:
- Parede 1 com as seguintes wallMaterialTypes:. Tijolo, gesso, madeira e wallArea () de 35 metros quadrados.
- Wall 2 com as seguintes wallMaterialTypes: Hay, gesso e wallArea () de 105 metros quadrados.
Agora, o que saída eu gostaria de ter é:
BRICK: 35 square meters.
Plaster: 140 square meters.
Wood: 35 square meters.
Hay: 105 square meters.
Meu código até agora está procurando algo como este, onde foi que eu puxado para cada
Map<WallType, Double> getIt = listOfWalls.stream()
.collect(groupingBy(Wall::getWallType, Collectors.summingDouble(Wall::getWallArea)));
De lá, eu sou ignorante como ir? Ajuda apreciada.
Parece que você deseja mapear pela WallMaterialType
enumeração.
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)));
Se você continuar ligando map(..)
e alcançar os WallMaterials , você perderia a de Wall wallArea
Daí, eu agrupei tudo em um único flatMap
passo para retornar um mapa (simples par faria muito) da parede tipo de material e área da parede.
(O flatMap
passo retorna um mapeamento simples de uma WallMaterialType
ea wallArea
para a qual a wallMaterialType
pertence).
A coleta é semelhante ao que você já escreveu.