Java8ストリームを使用して、リストから列挙型パラメータの項目でソート

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つの壁を持っていると仮定することができます:

  1. 以下wallMaterialTypes有する壁1:レンガ、石膏、木材及びwallArea()35平方メートル。
  2. ヘイ、石膏および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ステップでの単純なマッピングを返すWallMaterialTypewallAreaこれにwallMaterialType属します)。

収集は、すでに書いたものと同様です。

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=402341&siteId=1