记一次使用Stream流flatMap合并两个List

记一次工作中用到的 flatMap 流合并两个List,并生成一个新List的操作:
这里为什么用到了 flatMap 。是因为我在查SQL的时候,设涉及到的筛选条件(时间维度不同)不同才去用的 Stream 流的 flatMap 。具体怎么写看个人,大概有两种方式嘛,一是:写SQL子查询(公司要求尽量少些子查询和联表查询,就没用这种方法);二是:就这篇文章讲的 Stream 流的 flatMap 流的扁平化处理。如果还有其他的希望大佬指点指点;
注: 涉及到敏感数据我用 “****” 来替代了.
不多说直接上代码(就直接展示是业务层的代码);


        //第一个list结果集
        List tStDkList = tStDkDubboService.selectTstDkTrendReportList(tStDk);
        
        // 第二个list结果集
        List dkList = tStDkDubboService.selectDkList(tStDk);

        /**
        *组装 两个list的数据,成一个list结果集,我这里新封装结果集的一个Vo类;
        */
        List tStDkVoList = null;
            tStDkVoList = tStDkList.stream()
                // 对两个List做扁平化处理
                .flatMap(v -> dkList.stream()
                // 过滤出来符合自己想要的数据
                .filter(m -> v.getJydm().equals(m.getJydm()))
                 /**
                 * 这里面用到了前面封装Vo类的构造方法new TStDkVo(......),
                 * 按我想要的数据格式进行返回
                 *  
                 /
                .map(n -> new TStDkVo(v.getJydm(), v.getAmount(), v.getNum(), n.getAccountNum(),
                		v.getAreaName(),v.getAreaCode())))
                .collect(Collectors.toList());
        }

这里看一下两个List的查询结果和封装之后的结果

第一个 List 查询结果:

{
    "code": 1000,
    "result": [
        {
            "jydm": "1376",
            "amount": 16585.46,
            "num": 297,
            "areaCode": "******"
        },
        {
            "jydm": "1376",
            "amount": 230.39,
            "num": 166,
            "areaCode": "*******"
        },
        ..............
        ]
}

第二个 List 查询结果:

{
    "code": 1000,
    "result": [
        {
            "jydm": "****",
            "areaName": "******",
            "accountNum": 143,
            "areaCode": "*******"
        },
        {
            "jydm": "******",
            "areaName": "******",
            "accountNum": 90,
            "areaCode": "******"
        },
        ..............
        ]
}

可以看到两个List查询结果里面的属性值是有不一样的地方,下面可以看一下我们封装之后的 List 结果集是怎样的;
封装之后的返回数据:

{
    "code": 1000,
    "result": [
        {
            "accountNum": 143,
            "jydm": "1376",
            "amount": 16585.46,
            "num": 297,
            "areaName": "*****",
            "areaCode": "*******"
        },
        {
            "accountNum": 0,
            "jydm": "1376",
            "amount": 230.39,
            "num": 166,
            "areaName": "*******",
            "areaCode": "********"
        },
        ..........
        ]
}

这样就通过 flatMap 和其他的一些操作就将两个 List 进行了合并 ,得到了我想要的结果;
flatMap(对流扁平化处理):
使用flatMap方法的效果是,各个数组并不是分别映射一个流,而是映射成流的内容,所有使用map(Array::stream)时生成的单个流被合并起来,即扁平化为一个流。
个人理解,就是将两个不同的List1、List2,使用flatMap时,合并成一个新的List;

你可能感兴趣的:(Stream,list,stream,java)