【发布时间】:2018-10-15 10:03:22
【问题描述】:
我对 java 8 实现有关 HashMap 列表的多重聚合有疑问,(首选 "reduce" 函数,但不是必须的)
我需要按键名进行多重聚合 - "service" with split("_")[0] 如下面的 Json:
假设我的数据结构:
List<Map<String, Object>> payments = new ArrayList<>();
for(int i=0 ; ....i++){
Map<String, String> map = new HashMap<>();
map.put("service","IMAP_"+i);
map.put("storageValue",<some value>)
....
payments.add(map);
}
Json:
{
"payments": [
{
"service": "IMAP_1",
"storageValue": 10,
"users": "10"
},
{
"service": IMAP_2,
"storageValue": 20,
"users": "1"
},
{
"storageValue": 200,
"service": "Office 365 Exchange_1",
"users": "15"
},
{
"storageValue": 200,
"service": "Office 365 Exchange_2",
"users": "10"
},
{
"storageValue": 50,
"service": "SalesForce_1",
"users": "100"
}
]
}
结果应该是:
{
"payments": [
{
"service": "IMAP",
"storageValue": 30,
"users": "11"
},
{
"storageValue": 400,
"service": "Office 365 Exchange",
"users": "25"
},
{
"storageValue": 50,
"service": "SalesForce",
"users": "100"
}
]
}
应该是什么..
payments.stream().forEach(paymet -> {
paymet.entrySet().stream().map(....?...).reduce()...
);
【问题讨论】:
-
把它变成一个对象
{ "service": "IMAP", "storageValue": "30", "users": "11" },会让你的生活轻松很多。 -
@nullpointer 你是对的,但它是无法更改的遗留代码
-
@VitalyT 当然可以更改。即使您的职责只涉及这个单一操作,您最好先将这些映射转换为有意义的类的实例,使用这些实例以可维护的方式执行操作,然后将生成的实例转换回映射。但我怀疑这是您可以更改的代码的唯一部分。目前,您将要创建更多“无法更改的遗留代码”。