現(xiàn)有兩張表A表和B表,A表存放的是各省市的認證次數(shù),B表存放的是各省市的申領次數(shù),重點關注dq,cs這兩個字段,其他的字段可忽略
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?A表(省市認證次數(shù)表)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? B表(省市申領次數(shù)表)
項目中有以下需求:
? ? ?現(xiàn)要求統(tǒng)計各省市的認證次數(shù)和申領次數(shù),以及認證和申領次數(shù)之和,以此再地圖上展示數(shù)據(jù)。
? ? ? ?A表和B表中都有dq和cs這兩個字段,dq都表示行政區(qū)劃編碼,A表中的cs表示認證次數(shù),B表中的cs表示申領次數(shù),將兩張表中dq值相同的分組放進同一個map中,再計算認證次數(shù)和申領次數(shù)之和,這個需求很明顯就是Map要合并key的場景,將查出的數(shù)據(jù)進行合并,再分組,可使用Lambda表達式實現(xiàn),部分代碼如下:
Controller代碼:
/**
* 4、區(qū)域省份認證情況統(tǒng)計
* @return
*/
@PostMapping(value="/loadProvinceAuthData")
public ResponseVO loadProvinceAuthData() {
try {
Map<String, Object> data = new HashMap<>();
ReportExternalRiskEntity request = new ReportExternalRiskEntity();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date=new Date();
String startTime = sdf.format(date)+" 00:00:00";
String endTime = sdf.format(date)+" 23:59:59";
request.setStartTime(startTime);
request.setEndTime(endTime);
//List<Map<String,Object>> provinceAuthDataList = reportIdentityAuthStatService.getProvinceAuthDataList(request);
List<Map<String,Object>> provinceAuthDataList = shenLingRenZhengService.getProvinceAuthDataList(request);
data.put("list",provinceAuthDataList);
return RespUtil.success(data);
} catch (Exception e) {
log.error("請求接口loadProvinceAuthData報錯->{}",e);
return RespUtil.sysError(String.valueOf(ResultCodeEnum.SYSTEM_ERROR));
}
}
?重點看Service代碼中如何處理:
@Override
public List<Map<String, Object>> getProvinceAuthDataList(ReportExternalRiskEntity request) throws Exception {
List<Map<String, Object>> xzqhDataMapList = new ArrayList<>();
Map queryParams = new HashMap();
Date date=new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String queryDate = sdf.format(date);
queryParams.put("ywrq",queryDate);
List<Map<String, Object>> rzcsDqDataList = reportDpRzcsDqMapper.queryRzcsDqByYwrq(queryParams);//數(shù)據(jù)庫查詢認證次數(shù)返回的list
List<Map<String, Object>> slcsDqDataList = reportDpSlcsDqMapper.querySlcsDqByYwrq(queryParams);//數(shù)據(jù)庫查詢申領次數(shù)返回的list
PageData xzqhMap = CacheUtils.getTyZdMap(StaticVar.PROVICE_XZQH);
if(CollectionUtils.isNotEmpty(rzcsDqDataList) && CollectionUtils.isEmpty(slcsDqDataList)){ //認證區(qū)域統(tǒng)計查詢List有數(shù)據(jù)
for (Map<String, Object> rzcsMap : rzcsDqDataList) {
Map<String, Object> xzqhDataMap = new HashMap<>();
//String authnumStr = (String) rzcsMap.get("authnum"); //注意:會報錯java.math.BigDecimal cannot be cast to java.lang.Integer,先轉(zhuǎn)成String類型,再轉(zhuǎn)Integer
//Integer authNum = (Integer) rzcsMap.get("authnum")==null?0:(Integer) rzcsMap.get("authnum");
String authnumStr = StringUtils.isBlank(String.valueOf(rzcsMap.get("authnum")))?"0":String.valueOf(rzcsMap.get("authnum"));
Integer authNum = Integer.parseInt(authnumStr);
String rzdq = (String) rzcsMap.get("dq");
String rzdq_bm = rzdq+StaticVar.XZQH_SUFFIX;
xzqhDataMap.put("bm",rzdq_bm);
xzqhDataMap.put("name",xzqhMap.get(rzdq_bm));
xzqhDataMap.put("authNum",authNum);
xzqhDataMap.put("applyNum",0);
xzqhDataMap.put("totalNum",authNum);
xzqhDataMap.put("leval",getLeval(authNum));
xzqhDataMapList.add(xzqhDataMap);
}
}else if(CollectionUtils.isNotEmpty(slcsDqDataList) && CollectionUtils.isEmpty(rzcsDqDataList)){//申領區(qū)域統(tǒng)計查詢List有數(shù)據(jù)
for (Map<String, Object> slcsMap : slcsDqDataList) {
Map<String, Object> xzqhDataMap = new HashMap<>();
//Integer applyNum = (Integer) xzqhDataMap.get("applynum");
String applynumStr = StringUtils.isBlank(String.valueOf(slcsMap.get("applynum")))?"0":String.valueOf(slcsMap.get("applynum"));
Integer applyNum = Integer.parseInt(applynumStr);
String sldq = (String) xzqhDataMap.get("dq");
String sldq_bm = sldq+StaticVar.XZQH_SUFFIX;
xzqhDataMap.put("bm",sldq_bm);
xzqhDataMap.put("name",xzqhMap.get(sldq_bm));
xzqhDataMap.put("authNum",0);
xzqhDataMap.put("applyNum",applyNum);
xzqhDataMap.put("totalNum",applyNum);
xzqhDataMap.put("leval",getLeval(applyNum));
xzqhDataMapList.add(xzqhDataMap);
}
}else if(CollectionUtils.isNotEmpty(rzcsDqDataList) && CollectionUtils.isNotEmpty(slcsDqDataList)) { //申領和認證都有數(shù)據(jù)
for (Map<String, Object> rzcsMap : rzcsDqDataList) {
String authnumStr = StringUtils.isBlank(String.valueOf(rzcsMap.get("authnum")))?"0":String.valueOf(rzcsMap.get("authnum"));
Integer authNum = Integer.parseInt(authnumStr);
rzcsMap.put("authNum",authNum);//將authnum替換為authNum
rzcsMap.remove("authnum");//去掉那個authNum
}
for (Map<String, Object> slcsMap : slcsDqDataList) {
String applynumStr = StringUtils.isBlank(String.valueOf(slcsMap.get("applynum")))?"0":String.valueOf(slcsMap.get("applynum"));
Integer applyNum = Integer.parseInt(applynumStr);
slcsMap.put("applyNum",applyNum);
slcsMap.remove("applynum");
}
//合并,兩個數(shù)據(jù)list放入一個新的list中
List<Map<String, Object>> new_dataList = new ArrayList<>();
new_dataList.addAll(rzcsDqDataList);
new_dataList.addAll(slcsDqDataList);
//先分組,將key值相同的放在一個map中
xzqhDataMapList = new_dataList.stream()
.collect(Collectors.groupingBy(group -> group.get("dq").toString())) // 根據(jù)map中id的value值進行分組, 這一步的返回結(jié)果Map<String,List<Map<String, Object>>>
.entrySet() // 得到Set<Map.Entry<String, List<Map<String, Object>>>
.stream()
.map(m -> { // 進入映射環(huán)境
// m.getValue()的結(jié)果是 List<Map<String, Object>>
Map<String, Object> collect = m.getValue().stream()
// o.entrySet() 的結(jié)果是 Set<Map.Entry<String, Object>>
.flatMap(o -> o.entrySet().stream()).filter(e -> e.getValue() != null)//過濾下,value需要是不為空的,否則報錯
// (m1, m2) -> m1 的意思是如果key相同 m1 == m2 則value使用m1(此處為rzcsDqDataList中的值)
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (m1, m2) -> m1
));
return collect;
}).sorted(Comparator.comparing(m -> m.get("dq").toString())).collect(Collectors.toList());
System.out.println("處理后的xzqhDataMapList為:"+xzqhDataMapList);
System.out.println("處理后的xzqhDataMapList的Json為:"+ JSON.toJSONString(xzqhDataMapList));
//處理分組后的數(shù)據(jù),得到認證次數(shù)和申領次數(shù)之和totalNum
for (Map<String, Object> xzqhDataMap : xzqhDataMapList) {
String dq = (String) xzqhDataMap.get("dq");
int totalNum = 0;
Integer authNum = 0;
Integer applyNum = 0 ;
if(xzqhDataMap.containsKey("authNum")){
String authnumStr = StringUtils.isBlank(String.valueOf(xzqhDataMap.get("authNum")))?"0":String.valueOf(xzqhDataMap.get("authNum"));
authNum = Integer.parseInt(authnumStr);
}
if(xzqhDataMap.containsKey("applyNum")){
String applynumStr = StringUtils.isBlank(String.valueOf(xzqhDataMap.get("applyNum")))?"0":String.valueOf(xzqhDataMap.get("applyNum"));
applyNum = Integer.parseInt(applynumStr);
}
totalNum = authNum + applyNum;
int level = getLeval(totalNum);
xzqhDataMap.put("totalNum",totalNum);
xzqhDataMap.put("level",level);
if(!xzqhDataMap.containsKey("authNum")){ //若Map中沒有"authNum",補key,"authNum"
xzqhDataMap.put("authNum",0);
}
if(!xzqhDataMap.containsKey("applyNum")){ 若Map中沒有"applyNum",補key,"applyNum"
xzqhDataMap.put("applyNum",0);
}
//行政區(qū)劃翻譯
String xzqh_bm = dq+StaticVar.XZQH_SUFFIX;
xzqhDataMap.put("bm",xzqh_bm);
xzqhDataMap.put("name",xzqhMap.get(xzqh_bm));
xzqhDataMap.remove("dq");
}
}
return xzqhDataMapList;
}
//計算等級level值
private static int getLeval(int totalNum) {
int leval = 0;
if(totalNum==0){
return leval;
}
if(totalNum >=1 && totalNum <=900){
leval = 1;
}else if(totalNum >=901 && totalNum <=2000){
leval = 2;
}else if(totalNum >=2001 && totalNum <=4000){
leval = 3;
}else if(totalNum >=4001){
leval = 4;
}
return leval;
}
<!--查詢認證次數(shù)返回的list-->
<select id="queryRzcsDqByYwrq" parameterType="java.util.Map" resultType="java.util.Map">
select dq,sum(cs) as authNum from
report_dp_rzcs_dq
where ywrq =#{ywrq}
group by dq
</select>
<!--查詢申領次數(shù)返回的list-->
<select id="querySlcsDqByYwrq" parameterType="java.util.Map" resultType="java.util.Map">
select dq,sum(cs) as applyNum from
report_dp_slcs_dq
where ywrq = #{ywrq}
group by dq
</select>
請求接口http://127.0.0.1:8050/report/idauthstat/loadProvinceAuthData返回的數(shù)據(jù)結(jié)構(gòu)如下:
{
????"data":?{
????????"list":?[
????????????{
????????????????"totalNum":?228,
????????????????"level":?1,
????????????????"authNum":?228,
????????????????"name":?"河北",
????????????????"bm":?"130000",
????????????????"applyNum":?0
????????????},
????????????{
????????????????"totalNum":?189,
????????????????"level":?1,
????????????????"authNum":?189,
????????????????"name":?"內(nèi)蒙古",
????????????????"bm":?"150000",
????????????????"applyNum":?0
????????????},
????????????{
????????????????"totalNum":?356,
????????????????"level":?1,
????????????????"authNum":?356,
????????????????"name":?"遼寧",
????????????????"bm":?"210000",
????????????????"applyNum":?0
????????????},
????????????{
????????????????"totalNum":?798,
????????????????"level":?1,
????????????????"authNum":?662,
????????????????"name":?"吉林",
????????????????"bm":?"220000",
????????????????"applyNum":?136
????????????},
????????????{
????????????????"totalNum":?1260,
????????????????"level":?2,
????????????????"authNum":?1260,
????????????????"name":?"上海",
????????????????"bm":?"310000",
????????????????"applyNum":?0
????????????},
????????????{
????????????????"totalNum":?985,
????????????????"level":?2,
????????????????"authNum":?0,
????????????????"name":?"福建",
????????????????"bm":?"350000",
????????????????"applyNum":?985
????????????},
????????????{
????????????????"totalNum":?1006,
????????????????"level":?2,
????????????????"authNum":?0,
????????????????"name":?"江西",
????????????????"bm":?"360000",
????????????????"applyNum":?1006
????????????},
????????????{
????????????????"totalNum":?1209,
????????????????"level":?2,
????????????????"authNum":?0,
????????????????"name":?"山東",
????????????????"bm":?"370000",
????????????????"applyNum":?1209
????????????},
????????????{
????????????????"totalNum":?100,
????????????????"level":?1,
????????????????"authNum":?0,
????????????????"name":?"湖北",
????????????????"bm":?"420000",
????????????????"applyNum":?100
????????????},
????????????{
????????????????"totalNum":?1725,
????????????????"level":?2,
????????????????"authNum":?1725,
????????????????"name":?"湖南",
????????????????"bm":?"430000",
????????????????"applyNum":?0
????????????},
????????????{
????????????????"totalNum":?896,
????????????????"level":?1,
????????????????"authNum":?0,
????????????????"name":?"廣東",
????????????????"bm":?"440000",
????????????????"applyNum":?896
????????????},
????????????{
????????????????"totalNum":?625,
????????????????"level":?1,
????????????????"authNum":?489,
????????????????"name":?"重慶",
????????????????"bm":?"500000",
????????????????"applyNum":?136
????????????},
????????????{
????????????????"totalNum":?789,
????????????????"level":?1,
????????????????"authNum":?0,
????????????????"name":?"四川",
????????????????"bm":?"510000",
????????????????"applyNum":?789
????????????},
????????????{
????????????????"totalNum":?623,
????????????????"level":?1,
????????????????"authNum":?623,
????????????????"name":?"陜西",
????????????????"bm":?"610000",
????????????????"applyNum":?0
????????????},
????????????{
????????????????"totalNum":?1024,
????????????????"level":?2,
????????????????"authNum":?0,
????????????????"name":?"新疆",
????????????????"bm":?"650000",
????????????????"applyNum":?1024
????????????},
????????????{
????????????????"totalNum":?420,
????????????????"level":?1,
????????????????"authNum":?420,
????????????????"name":?"臺灣",
????????????????"bm":?"710000",
????????????????"applyNum":?0
????????????},
????????????{
????????????????"totalNum":?876,
????????????????"level":?1,
????????????????"authNum":?876,
????????????????"name":?"香港",
????????????????"bm":?"810000",
????????????????"applyNum":?0
????????????}
????????]
????},
????"msg":?"操作成功",
????"success":?true,
????"code":?"I000000",
????"total":?null
}文章來源:http://www.zghlxwxcb.cn/news/detail-535117.html
統(tǒng)計完成,可參考?文章來源地址http://www.zghlxwxcb.cn/news/detail-535117.html
到了這里,關于使用Lambda表達式對List<Map<String,Object>>中key值相同的Map進行分組合并的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!