Java8實現分組求和

因爲的美國的制裁,加速了國內不少公司產品構成去美化進程,而在軟件行業的數據庫層面,愈來愈多的公司進行去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

相關文章
相關標籤/搜索