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