栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

@Data
public class Activity implements Serializable {

    private static final long serialVersionUID = 7353320757077145027L;

    private Long id;

    
    private Long activityId;

    
    private Long pv;

    
    private Long prizeCount;

    
    private Data createTime;

}

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

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

    private List groupMergeToList(List dataList, Function 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 dataList = new ArrayList<>();
        dataList.add(activity1);
        dataList.add(activity2);
        dataList.add(activity3);

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

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

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

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/821775.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号