我从mysql中选择了一些数据。然后我想格式化它。 数据就像:
var json = [
{
"date": "2016-01",
"number": "1",
"code": "420000",
"type": "false"
},
{
"date": "2016-01",
"number": "2",
"code": "440000",
"type": "false"
},
{
"date": "2016-02",
"number": "3",
"code": "420000",
"type": "false"
},
{
"date": "2016-03",
"number": "4",
"code": "420000",
"type": "true"
},
{
"date": "2016-03",
"number": "5",
"code": "410000",
"type": "false"
},
{
"date": "2016-03",
"number": "6",
"code": "440000",
"type": "true"
},
{
"date": "2016-04",
"number": "7",
"code": "420000",
"type": "false"
},
{
"date": "2016-04",
"number": "8",
"code": "440000",
"type": "false"
}
];
console.log(json);

我想groupingBy
日期,partitioningBy
类型,reducing
到地图。
格式化数据之后就像
var json = {
"2016-01": {
"false": {
"420000": "1",
"440000": "2"
}
},
"2016-02": {
"false": {
"420000": "3"
}
},
"2016-03": {
"false": {
"410000": "5"
},
"true": {
"420000": "4",
"440000": "6"
}
},
"2016-04": {
"false": {
"420000": "7",
"440000": "8"
}
}
};
console.log(json);

我编写java8 Stream
public static void main(String[] args) {
List<Map<String, String>> postmans = new ArrayList<>();
// "420000" : post area code, "false": just paper(without goods)
postmans.add(createMap("2016-01", "1", "420000", "false"));
postmans.add(createMap("2016-01", "2", "440000", "false"));
postmans.add(createMap("2016-02", "3", "420000", "false"));
postmans.add(createMap("2016-03", "4", "420000", "true"));
postmans.add(createMap("2016-03", "5", "410000", "false"));
postmans.add(createMap("2016-03", "6", "440000", "true"));
postmans.add(createMap("2016-04", "7", "420000", "false"));
postmans.add(createMap("2016-04", "8", "440000", "false"));
// before, I use fastjson Library
System.out.println(JSONObject.toJSONString(postmans));
Map<String, Map<Boolean, Map>> data = postmans.stream()
.collect(Collectors.groupingBy(d -> d.get("date"), TreeMap::new,
Collectors.partitioningBy(d-> d.get("type").equals("true"),
Collectors.reducing(new HashMap(), (d1, d2)->{
Object code = d2.get("code");
Object number = d2.get("number");
// I think bug in reducing
d1.put(code, number);
return d1;
}))));
// after, I use fastjson Library
System.out.println(JSONObject.toJSONString(data));
}
private static Map<String,String> createMap(String date, String number, String code, String type){
Map<String, String> map = new HashMap<>();
map.put("date", date);
map.put("number", number);
map.put("code", code);
map.put("type", type);
return map;
}
但是,实际结果是
var json = {
"2016-01": {
"false": {
"410000": "5",
"420000": "7",
"440000": "8"
},
"true": {
"410000": "5",
"420000": "7",
"440000": "8"
}
},
"2016-02": {
"false": {
"410000": "5",
"420000": "7",
"440000": "8"
},
"true": {
"410000": "5",
"420000": "7",
"440000": "8"
}
},
"2016-03": {
"false": {
"410000": "5",
"420000": "7",
"440000": "8"
},
"true": {
"410000": "5",
"420000": "7",
"440000": "8"
}
},
"2016-04": {
"false": {
"410000": "5",
"420000": "7",
"440000": "8"
},
"true": {
"410000": "5",
"420000": "7",
"440000": "8"
}
}
};
console.log(json);
&#13;
我认为reduing
中此错误的原因。当partitioningBy
获得新的List <Map>
时,旧d1
仍然存在。
我只想partitioningBy
结果,每个List <Map>
压缩到一个地图,我可以保证其key (code)
是唯一的。
我很抱歉代码很长,我的英语很差。谢谢你的帮助!
答案 0 :(得分:1)
这里有两个主要错误。 Collectors.reducing
,因为这是一个减少,需要一直返回一个新实例,基本上第二个是你的逻辑有缺陷:
Map<String, Map<Boolean, Map<String, String>>> data = postmans.stream()
.collect(Collectors.groupingBy(
d -> d.get("date"),
TreeMap::new,
Collectors.partitioningBy(
d -> d.get("type").equals("true"),
Collectors.reducing(
new HashMap<>(),
(left, right) -> {
Map<String, String> map = new HashMap<>();
String leftCode = left.get("code");
String leftNumber = left.get("number");
if (leftCode == null) {
map.putAll(left);
} else {
map.put(leftCode, leftNumber);
}
String rightCode = right.get("code");
String rightNumber = right.get("number");
map.put(rightCode, rightNumber);
return map;
}))));
您还存在将Date
存储为String
并执行TreeMap::new
的问题 - 基本上对Strings
进行排序,这可能不是您想要的排序。通常,将所有内容都设为String
的整个方法使代码难以读取。