Сортировка по элементам перечисления параметров из списка с использованием потоков Java8 - PullRequest
2 голосов
/ 02 апреля 2020

Предположим, у меня есть список стен listOfWalls и каждый объект стены имеет следующую иерархию:

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

, поэтому для получения wallMaterialType какой-либо стены в этом списке я бы go хотел

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

Теперь класс Wall имеет также следующие параметры: width и height, которые, умноженные вместе, получают площадь стены, вызывая мою функцию getWallArea() из класса Wall.

Что Я хотел бы добиться, чтобы получить площадь всех wallMaterialTypes из списка вычисленных стен, поэтому, например, предположим, что у нас есть 2 стены:

  1. Стена 1 со следующими wallMaterialTypes: Brick, Plaster, Wood и wallArea () 35 кв. метров.
  2. Стена 2 со следующими типами wallMaterialTypes: Hay, Plaster и wallArea () 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)));

Оттуда я не знаю, как go? Помощь оценена.

1 Ответ

3 голосов
/ 02 апреля 2020

Кажется, вы хотите нанести на карту с помощью перечисления 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 , вы потеряете * 1008 стены. * Следовательно, я сгруппировал все в один flatMap шаг, чтобы вернуть карту (простую пару тоже) с типом материала стены и площадью стены.

(Шаг flatMap возвращает простое отображение WallMaterialType и wallArea, к которым принадлежит wallMaterialType).

Сборник аналогичен тому, что вы уже написали.

...