Фон
У меня есть список карт, которые выглядят примерно так:
[
{
"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()
принимает только одну функцию отображения и нисходящий коллекционер, но я не уверен, как отобразить сразу два значения.
Есть ли еще одна функция, необходимая для создания сопоставлений двух разных значений? Любые предложения относительно лучших способов сделать это также очень ценятся.