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



