Java8实现分组求和
由于的美国的制裁,加速了国内很多公司产品构成去美化进程,⽽在软件⾏业的数据库层⾯,越来越多的公司进⾏去Oracle化。本⼈所在公司有⾃研内存数据库,聚合函数的⽀持初期没那么完善,有时⼀部分逻辑要从数据库转化到java实现,今天举⼀个java实现分组求和来代替数据库聚合函数sum()+group by的栗⼦
groupby分组分组求和
举⼀个⽣产过程的引⽤例⼦,代码如下:
/**
* @Description //TODO 根据客户列表查⽋费信息
* @Date: 2021/7/15
**/
public List<UnPayBillDTO>getUnPayInfo(List<Long> contractNoList,String yearMonth){
List<UnPayBillDTO> unPayBillDTOList =new ArrayList<>();// 结果集
for(long contractNo : contractNoList){
ActUnpayoweInfo actUnpayoweInfoParam =new ActUnpayoweInfo();
actUnpayoweInfoParam.setContractNo(contractNo);
List<ActUnpayoweInfo> actUnpayoweInfos = actUnpayoweInfoMapper.select(actUnpayoweInfoParam);// 该账户所有⽋费信息
/* 分组 */
Map<String,List<ActUnpayoweInfo>> afterGroupMap
= actUnpayoweInfos.stream().
filter(o -> o.getNaturalMonth().equals(yearMonth)).// 过滤掉当⽉⽋费
upingBy(o -> o.getContractNo()+"_"+ o.getNaturalMonth()+"_"+ o.getAcctItemCode()));
afterGroupMap.forEach(
(group, groupInfo)->{
/* 获取分组字段 */
String[] tmpInfo = group.split("_");
long tmpContractNo = Long.parseLong(tmpInfo[0]);
String tmpNaturalMonth = tmpInfo[1];
String tmpAcctItemCode = tmpInfo[2];
/* 求和 */
long totalMoney = groupInfo.stream().mapToLong(this::calculate).sum();
UnPayBillDTO unPayBillDTO =new UnPayBillDTO();
unPayBillDTO.setContractNo(tmpContractNo);
unPayBillDTO.setNaturalMonht(tmpNaturalMonth);
unPayBillDTO.setAcctItemCode(tmpAcctItemCode);
unPayBillDTO.setTotalMoney(totalMoney);
unPayBillDTOList.add(unPayBillDTO);
}
);
}
return unPayBillDTOList;
}
分组
分组是先利⽤stream进⾏遍历,然后以group by涉及的字段进⾏拼接,作为Collector进⾏分组的条件,最终返回⼀个以分组条件拼接的字符串作为key值,分好组的各个对应list作为value的map;
Map<String,List<ActUnpayoweInfo>> afterGroupMap
= actUnpayoweInfos.stream().
filter(o -> o.getNaturalMonth().equals(yearMonth)).// 过滤掉当⽉⽋费
upingBy(o -> o.getContractNo()+"_"+ o.getNaturalMonth()+"_"+ o.getAcctItemCode()));
求和
对每⼀组进⾏处理,从key值获取分组条件信息,对value值⾥⾯的多条数据相关字段进⾏计算后累加求和
/* 获取分组字段 */
String[] tmpInfo = group.split("_");
long tmpContractNo = Long.parseLong(tmpInfo[0]);
String tmpNaturalMonth = tmpInfo[1];
String tmpAcctItemCode = tmpInfo[2];
/* 求和 */
long totalMoney = groupInfo.stream().mapToLong(this::calculate).sum();
this::calculate 是涉及业务的⼀些计算,这⾥不做展开
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论