lambda 单字段分组后,对其他字段(BigDecimal类型)进行求和

最近接到一个比较复杂的数据统计需求,对查出来的数据进行分组统计,当时脑海就浮现出,数据统计?这不就是lambda的特长嘛!但是在实现的过程中发现,处理起来还挺头疼的,还好最后是搞出来了,下面贴上主要的示例代码,希望能帮到碰到类似问题的同行们。

温馨提示:请自行先引入lombok 依赖噢~


import lombok.*;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Test {

    @NoArgsConstructor
    @AllArgsConstructor
    @Getter
    @Setter
    @ToString
    static class ActivityRecord {
        private String id;
        private String mobile;
        /**
         * 投入金额
         */
        private BigDecimal amount;
        /**
         * 赢得金额
         */
        private BigDecimal winAmount;
        /**
         * 是否中奖。中奖则为1,不中则为0,这样可以统计中奖次数
         */
        private Integer winCount;


        public ActivityRecord(BigDecimal amount, BigDecimal winAmount, Integer winCount) {
            this.amount = amount;
            this.winAmount = winAmount;
            this.winCount = winCount;
        }
    }

    public static void main(String[] args) {
        List<ActivityRecord> list = Arrays.asList(new ActivityRecord("111", "13588889999"
                        , new BigDecimal("100"), new BigDecimal("110"), 1)
                , new ActivityRecord("112", "13760606060"
                        , new BigDecimal("200"), new BigDecimal("220"), 1)
                , new ActivityRecord("113", "13944442222"
                        , new BigDecimal("100"), new BigDecimal("0"), 0)
                , new ActivityRecord("114", "13760606060"
                        , new BigDecimal("100"), new BigDecimal("110"), 1)
                , new ActivityRecord("115", "13588889999"
                        , new BigDecimal("100"), new BigDecimal("0"), 0)
        );
        Map<String, ActivityRecord> collect =
                list.parallelStream().collect(Collectors.groupingBy(ActivityRecord::getMobile
                        , Collectors.collectingAndThen(Collectors.toList(), m -> {
                            BigDecimal amount = m.parallelStream().map(ActivityRecord::getAmount).reduce(BigDecimal.ZERO,BigDecimal::add);
                            BigDecimal winAmount = m.parallelStream().map(ActivityRecord::getWinAmount).reduce(BigDecimal.ZERO,BigDecimal::add);
                            Integer winCount = m.parallelStream().mapToInt(ActivityRecord::getWinCount).sum();

                            return new ActivityRecord(amount, winAmount, winCount);
                        })));

        System.out.println("collect = " + collect);

    }
}

运行结果:

collect = {13944442222=Test.ActivityRecord(id=null, mobile=null, amount=100, winAmount=0, winCount=0), 13588889999=Test.ActivityRecord(id=null, mobile=null, amount=200, winAmount=110, winCount=1), 13760606060=Test.ActivityRecord(id=null, mobile=null, amount=300, winAmount=330, winCount=2)}

刚好结果是我想要的!

 

学无止境,生生不息!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值