Java 8的Stream API分组。将List<Map<String, String>>集合分组,分组条件为动态集合List<String>

有一个集合:

复制代码
{
    "condition": [
        "key3774","key3770"
    ],
    "body": [
        {
            "key3779": "44406107.75",
            "key3778": "-49468430.57",
            "key3774": "一二三航",
            "key3770": "SHY",
            "key": "1742796948097728512"
        },
        {
            "key3782": "634",
            "key3775": "634",
            "key3774": "一二三航",
            "key3770": "SHY",
            "key": "1742796948097728513"
        },
        {
            "key3779": "971864954.96",
            "key3778": "-98854650.65",
            "key3774": "上航",
            "key3770": "SHK",
            "key": "1742796948097728514"
        },
        {
            "key3782": "3921",
            "key3775": "3921",
            "key3774": "上航",
            "key3770": "SHK",
            "key": "1742796948097728515"
        }
    ]
}

将该集合中的body,根据分组条件condition进行分组,后再聚合。

最终变为如下集合:

复制代码
{
    "condition": [
        "key3774","key3770"
    ],
    "body": [
        {
            "key3779": "44406107.75",
            "key3778": "-49468430.57",
            "key3774": "一二三航",
            "key3770": "SHY",
            "key": "1742796948097728512",
            "key3782": "634",
            "key3775": "634"
        },
        {
            "key3779": "971864954.96",
            "key3778": "-98854650.65",
            "key3774": "上航",
            "key3770": "SHK",
            "key": "1742796948097728514",
            "key3782": "3921",
            "key3775": "3921"
        }
    ]
}

执行代码:

复制代码
 private List<Map<String, String>> groupByCondition(List<Map<String, String>> body, List<String> conditionList) {

        List<Map<String, String>> bodyRes = new ArrayList<>();

        // 根据condition分组
        Map<String, List<Map<String, String>>> recordMap = body.stream().collect(Collectors.groupingBy(map -> {
            StringBuilder s = new StringBuilder();
            conditionList.forEach(c -> {
                if (s.length() != 0) {
                    s.append("#");
                }
                s.append(map.get(c));
            });
            return s.toString();
        }));

        // 分组后聚合
        recordMap.forEach((k, v) -> {
            if (CollectionUtils.isEmpty(v)) {
                return;
            }
            if (v.size() > 1) {
                // list有2个及以上,聚合
                Map<String, String> mapRes = new HashMap<>();
                v.forEach(mapRes::putAll);
                bodyRes.add(mapRes);
            } else {
                // list有1个,直接取值
                bodyRes.add(v.get(0));
            }
        });

        return bodyRes;
    }
相关推荐
范纹杉想快点毕业21 小时前
嵌入式系统架构之道:告别“意大利面条”,拥抱状态机与事件驱动
java·开发语言·c++·嵌入式硬件·算法·架构·mfc
苏宸啊21 小时前
list底层实现
c++·list
2501_9403152621 小时前
【无标题】2390:从字符串中移除*
java·开发语言·算法
半聋半瞎21 小时前
Flowable快速入门(Spring Boot整合版)
java·spring boot·后端·flowable
散峰而望1 天前
【算法竞赛】树
java·数据结构·c++·算法·leetcode·贪心算法·推荐算法
毕设源码-邱学长1 天前
【开题答辩全过程】以 基于SpringBoot的理工学院学术档案管理系统为例,包含答辩的问题和答案
java·spring boot·后端
shejizuopin1 天前
基于SSM的高校旧书交易系统的设计与实现(毕业论文)
java·mysql·毕业设计·论文·ssm·毕业论文·高校旧书交易系统的设计与实现
修己xj1 天前
SpringBoot解析.mdb文件实战指南
java·spring boot·后端
咩图1 天前
Sketchup软件二次开发+Ruby+VisualStudioCode
java·前端·ruby
我命由我123451 天前
Android 开发问题:Duplicate class android.support.v4.app.INotificationSideChannel...
android·java·开发语言·java-ee·android studio·android-studio·android runtime