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.你我皆凡人,学习是一个不断重复的过程!加油!!!