Java8-根据List对象某个字段分组并对相关字段进行计算

Java8-根据List对象某个字段分组并对相关字段进行计算

1.老夫有个对象,有如下字段

@Data
public class Activity implements Serializable {

    private static final long serialVersionUID = 7353320757077145027L;

    private Long id;

    /**
     * 活动ID
     */
    private Long activityId;

    /**
     * pv数
     */
    private Long pv;

    /**
     * 奖品放数
     */
    private Long prizeCount;

    /**
     * 创建时间
     */
    private Data createTime;

}

需求:根据活动ID进行分组后,统计pv和prizeCount。

2.老夫接到需求后二话不说就开干。先定义一个方法,如下:

/**
     * 1.根据传入的数据集与指定的分组字段进行分组
     * 2.分组完成后对指定的字段进行计算
     * 3.返回一个新的数据集
     *
     * @param dataList  需要分组的数据集合
     * @param groupFunc 分组字段
     * @return List<Activity>
     */
    private List<Activity> groupMergeToList(List<Activity> dataList, Function<Activity, ?> groupFunc) {
        return dataList.stream().collect(Collectors.groupingBy(
                groupFunc
        )).values().stream().flatMap(list -> Stream.of(list.stream().reduce((data1, data2) -> {
            data1.setPv(data1.getPv() + data2.getPv());
            data1.setPrizeCount(data1.getPrizeCount() + data2.getPrizeCount());
            return data1;
        }).orElse(new Activity()))).collect(Collectors.toList());
    }

3.老夫测试下效果

@Test
    public void groupMergeToList() {
        Activity activity1 = new Activity();
        activity1.setId(996L);
        activity1.setActivityId(10010L);
        activity1.setPv(5L);
        activity1.setPrizeCount(4L);

        Activity activity2 = new Activity();
        activity2.setId(997L);
        activity2.setActivityId(10086L);
        activity2.setPv(7L);
        activity2.setPrizeCount(2L);

        Activity activity3 = new Activity();
        activity3.setId(998L);
        activity3.setActivityId(10086L);
        activity3.setPv(23L);
        activity3.setPrizeCount(12L);

        List<Activity> dataList = new ArrayList<>();
        dataList.add(activity1);
        dataList.add(activity2);
        dataList.add(activity3);

        log.info("分组前---");
        dataList.forEach(data -> {
            log.info(data.toString() + "\n");
        });

        List<Activity> dataListNew = groupMergeToList(dataList, Activity::getActivityId);

        log.info("分组后---");
        dataListNew.forEach(data -> {
            log.info(data.toString() + "\n");
        });
    }

4.老夫看测试结果:
可以看到,activityId为10086的数据已归为一个组,其pv与prizeCount已完美合体!

5.你我皆凡人,学习是一个不断重复的过程!加油!!!

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值