joyag95613:
私は壁listOfWallsのリストを持っており、各壁オブジェクト階層を以下していることを前提としています:
wall -> wallType -> wallEntry(list of wall materials ) -> wallMaterial -> wallMaterialType(enum type),
したがって、このリストには、いくつかの壁のwallMaterialTypeを得るために、私のように行くだろう
wall.getWallType().getWallEntry().getWallMaterial().getWallMaterialType();
今、クラスの壁ものparamsを以下していますwidth
し、height
私の関数を呼び出すことによって、壁の面積を取得し、一緒に乗じたgetWallArea()
ウォールクラスから。
私は何を達成したいことは計算壁のリストからすべてのwallMaterialTypesの面積を得ることですので、例えば、我々は2つの壁を持っていると仮定することができます:
- 以下wallMaterialTypes有する壁1:レンガ、石膏、木材及びwallArea()35平方メートル。
- ヘイ、石膏および105平方メートルのwallArea():下記wallMaterialTypesと壁2。
今、私が持っていると思いますどのような出力は、次のとおりです。
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)));
そこから私は行くにはどのように無知ですか?ヘルプは大歓迎しました。
user7:
あなたがでマッピングしたいと思われる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を、あなたがウォールのを失うことになるwallArea
ので、私は単一にすべてをグループ化してきたflatMap
壁材料の種類や壁の面積の(簡単なペアもそうでしょう)マップを返すようにステップ。
(flatMap
ステップでの単純なマッピングを返すWallMaterialType
とwallArea
これにwallMaterialType
属します)。
収集は、すでに書いたものと同様です。