Classificando por enum parâmetros itens de uma lista usando fluxos Java8

joyag95613:

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: widthe heightque 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:

  1. Parede 1 com as seguintes wallMaterialTypes:. Tijolo, gesso, madeira e wallArea () de 35 metros quadrados.
  2. 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.

user7:

Parece que você deseja mapear pela WallMaterialTypeenumeraçã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 wallAreaDaí, eu agrupei tudo em um único flatMappasso para retornar um mapa (simples par faria muito) da parede tipo de material e área da parede.

(O flatMappasso retorna um mapeamento simples de uma WallMaterialTypeea wallAreapara a qual a wallMaterialTypepertence).

A coleta é semelhante ao que você já escreveu.

Acho que você gosta

Origin http://10.200.1.11:23101/article/api/json?id=402340&siteId=1
Recomendado
Clasificación