因爲的美國的制裁,加速了國內不少公司產品構成去美化進程,而在軟件行業的數據庫層面,愈來愈多的公司進行去Oracle化。本人所在公司有自研內存數據庫,聚合函數的支持初期沒那麼完善,有時一部分邏輯要從數據庫轉化到java實現,今天舉一個java實現分組求和來代替數據庫聚合函數sum()+group by的栗子java
舉一個生產過程的引用例子,代碼以下:數據庫
/** * @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)). // 過濾掉當月欠費 collect(Collectors.groupingBy(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;app
Map<String,List<ActUnpayoweInfo>> afterGroupMap = actUnpayoweInfos.stream(). filter(o -> o.getNaturalMonth().equals(yearMonth)). // 過濾掉當月欠費 collect(Collectors.groupingBy(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
是涉及業務的一些計算,這裏不作展開this