Фон
У меня есть список карт, который выглядит примерно так:
[
{
"name": "A",
"old": 0.25,
"new": 0.3
},
{
"name": "B",
"old": 0.3,
"new": 0.35
},
{
"name": "A",
"old": 0.75,
"new": 0.7
},
{
"name": "B",
"old": 0.7,
"new": 0.60
}
]
, и я хочу, чтобы вывод выглядел так:
{
"A": {
"old": 1,
"new": 1
},
"B": {
"old": 1,
"new": 0.95
}
}
... где значения old
и new
суммируются для каждой связанной записи.
Тип данных списка карт - List<Map<String, Object>>
, поэтому на выходе должно быть Map<String, Map<String, Double>>
.
Что я попробовал
С помощью некоторого чертежа диаграммы, чтения документации, проб и ошибок я смог придумать следующее:
data.stream()
.collect(
Collectors.groupingBy(entry -> entry.get("name"),
Collectors.summingDouble(entry ->
Double.parseDouble(entry.get("old").toString())))
);
для производстваобъект типа Map<String, Double>
, где на выходе получается
{
"A": 1,
"B": 1
}
для суммирования значений old
.Тем не менее, я не могу преобразовать это в карту карт.Примерно так:
data.stream()
.collect(
Collectors.groupingBy(entry -> entry.get("name"),
Collectors.mapping(
Collectors.groupingBy(entry -> entry.get("old"),
Collectors.summingDouble(entry ->
Double.parseDouble(entry.get("old").toString())
)
),
Collectors.groupingBy(entry -> entry.get("new"),
Collectors.summingDouble(entry ->
Double.parseDouble(entry.get("new").toString())
)
)
)
)
);
не работает, потому что Collectors.mapping()
принимает только одну функцию отображения и нисходящий коллектор, но я не уверен, как отобразить два значения одновременно.
Есть ли еще одна функция, мне нужно создать сопоставления двух разных значений?Любые предложения о лучших способах сделать это также приветствуются.