3

List<Map<String, Object>>私はこのようなリストを持っています

[
   {"A": 50,
      "B": 100,
      "C": 200,
      "D": "Auction"
    },
    {
      "A": 101322143.24,
      "B": 50243301.2,
      "C": 569,
      "D": "Sold Promissory Buyer"
    },
    {
      "A": 500,
      "B": 1000,
      "C": 1500,
      "D": "Auction"
    }]

このストリーム API メソッドを使用して、このリストをマップに変換しています

finalSalesReportForSoldProperty.stream().collect(Collectors.toMap(tags -> ((String) tags.get("D")).replaceAll("[\\- ]", ""), Function.identity()));

java.lang.IllegalStateException: Duplicate keyしかし、私のリストには重複したキーがあるため、例外がスローされます

重複キーの内部要素を追加したい、このような出力が欲しい

    "Auction": {
           "A": 550, 
           "B": 1100, 
           "C": 1650, 
           "D": "Auction" 
      } ,
"Sold Promissory Buyer" :{ 
          "A": 101322143.24,
          "B": 50243301.2,
          "C": 569,
          "D": "Sold Promissory Buyer"
        }

JavaストリームAPIを介して可能ですか?

4

1 に答える 1

3

コレクターのmergeFunctionパラメーターを使用する必要があります。toMap(keyMapper, valueMapper, mergeFunction)この関数は重複した値に対して呼び出され、それらの 2 つの値を新しい値にマージします。

この場合、同じキーで値を合計して 2 つのマップをマージする必要があります。これを行う最も簡単な解決策は、2 番目のマップのすべてのエントリを繰り返し処理し、最初のマップの各エントリをマージすることです。マッピングが存在しない場合は、正しい値で作成されます。その場合、新しい値は 2 つの現在の値の合計になります。

ここで、各値が実際には a であると仮定しますDouble

finalSalesReportForSoldProperty.stream().collect(Collectors.toMap(
    tags -> ((String) tags.get("assetStatus")).replaceAll("[\\- ]", ""),
    Function.identity(),
    (m1, m2) -> {
        Map<String, Object> map = new HashMap<>(m1);
        m2.entrySet().stream()
                     .filter(e -> e.getValue() instanceof Double)
                     .forEach(e -> map.merge(e.getKey(), e.getValue(), (o1, o2) -> ((Double) o1) + ((Double) o2)));
        return map;
    }
));
于 2016-02-03T14:58:57.953 に答える