Stream流将对象分类求和并插入原先集合

60 阅读2分钟

在最近的实习中,遇到了一个需求,麻烦了好几久,网上搜索也搜索不到,因此把本次经验记录下来为以后的自己或各位朋友提供一种思路。

image.png

有一个这样的列表,我需要通过大区与MAC进行分组,并把分组统计之后的数据求和插入列表,效果图如下

image.png 可以通过stream流进行计算,代码如下

Map<String, List<ReportPassengerFlowData>> dataGroupByRegion = dataList.stream()
        .collect(Collectors.groupingBy(ReportPassengerFlowData::getRegion));
dataGroupByRegion.entrySet().stream().forEach(new Consumer<Map.Entry<String, List<ReportPassengerFlowData>>>() {
    @Override
    public void accept(Map.Entry<String, List<ReportPassengerFlowData>> stringListEntry) {
        List<ReportPassengerFlowData> value = stringListEntry.getValue();
        Map<String, List<ReportPassengerFlowData>> collect = value.stream().collect(Collectors.groupingBy(ReportPassengerFlowData::getMac));
        collect.entrySet().forEach(stringListEntry1 -> {
            List<ReportPassengerFlowData> value1 = stringListEntry1.getValue();
            ReportPassengerFlowData reportPassengerFlowData = new ReportPassengerFlowData("", value1.get(0).getMac() + " 汇总", "", "", 0, 0, 0, 0D, 0, 0, 0, 0D, 0, 0, 0, 0D, 0, 0, 0, 0D, 0, 0, 0, 0D, 0, 0, 0, 0D);
            //循环得到mac的数据
            value1.forEach(a -> {
                sumData(reportPassengerFlowData, a);
            });
            //填入MAC误差率
            setDiff(reportPassengerFlowData);
            //判断插值中是否有Nan和isInfinite
            isNan(reportPassengerFlowData);
            //得到mac分组的最后一个元素的索引
            int i = dataList.indexOf(value1.get(value1.size() - 1));
            //在mac的最后添加MAC汇总
            dataList.add(i + 1, reportPassengerFlowData);
        });
        //得到当前大区汇总的数据
        ReportPassengerFlowData reportPassengerFlowData = new ReportPassengerFlowData(value.get(0).getRegion() + " 汇总", "", "", "", 0, 0, 0, 0D, 0, 0, 0, 0D, 0, 0, 0, 0D, 0, 0, 0, 0D, 0, 0, 0, 0D, 0, 0, 0, 0D);
        value.forEach(a -> {
            sumData(reportPassengerFlowData, a);
        });
        //填入大区误差率
        setDiff(reportPassengerFlowData);
        //判断插值中是否有Nan和isInfinite
        isNan(reportPassengerFlowData);
        //计算总计
        sumData(sumAllData, reportPassengerFlowData);
        //得到大区分组的最后一个元素的索引
        int i = dataList.indexOf(value.get(value.size() - 1));
        //在大区的最后添加大区汇总
        dataList.add(i + 2, reportPassengerFlowData);
    }
});

先将dataList通过大区分组,在大区分组中在进行对Mac分组。

//大区分组

Map<String, List<ReportPassengerFlowData>> dataGroupByRegion = dataList.stream()
        .collect(Collectors.groupingBy(ReportPassengerFlowData::getRegion));
dataGroupByRegion.entrySet().stream().forEach(new Consumer<Map.Entry<String, List<ReportPassengerFlowData>>>() {

//进行Mac分组
```
List<ReportPassengerFlowData> value = stringListEntry.getValue();
Map<String, List<ReportPassengerFlowData>> collect = value.stream().collect(Collectors.groupingBy(ReportPassengerFlowData::getMac));
collect.entrySet().forEach()
```
})

在Mac分组中,得到mac汇总数据 如 lin0汇总,这时我们考虑如何插入数据, 我们可以得到当前mac分组的最后一个元素,通过索引来得到最后一个元素在datalist的位置,通过datalist的add方法(索引,数据),索引即为mac最后一个元素的索引+1

大区分组同理