flatMap实战

需求分析

同一公司,同一产品可能有多条广告计划,每条广告计划的消耗不同,财务统计页面需要按天统计不同产品的消耗总和。

示例说明

处理前:

[{"consumption":50,"date":"2022-09-21","deptName":"字节","productName":"飞书"},
{"consumption":100,"date":"2022-09-21","deptName":"字节","productName":"抖音"},
{"consumption":100,"date":"2022-09-21","deptName":"字节","productName":"飞书"},
{"consumption":75,"date":"2022-09-20","deptName":"字节","productName":"飞书"},
{"consumption":60,"date":"2022-09-21","deptName":"字节","productName":"抖音"}]

合并后:

[{"consumption":150,"date":"2022-09-21","deptName":"字节","productName":"飞书"},
{"consumption":160,"date":"2022-09-21","deptName":"字节","productName":"抖音"},
{"consumption":75,"date":"2022-09-20","deptName":"字节","productName":"飞书"}]

说明: 对相同日期和相同产品的数据进行合并,消耗相加。好比处理前的第一条和第三条是同一个时间(2022-09-21),同一个产品(飞书)产生的消耗,最终合并为合并后的第一条。

代码示例

 1 public class MapFlatMapTest {
 2     public static void main(String[] args) {
 3 
 4         /**
 5          * 需求分析:同一公司,同一产品可能有多条广告计划,每条广告计划的消耗不同,财务统计页面需要按天统计不同产品的消耗总和。
 6          */
 7         LinkedList<FinanceStatisticsDto> processList = new LinkedList<>();
 8         FinanceStatisticsDto dto1 = new FinanceStatisticsDto().setDate("2022-09-21").setDeptName("字节").setProductName("飞书").setConsumption(new BigDecimal(50));
 9         FinanceStatisticsDto dto2 = new FinanceStatisticsDto().setDate("2022-09-21").setDeptName("字节").setProductName("抖音").setConsumption(new BigDecimal(100));
10         FinanceStatisticsDto dto3 = new FinanceStatisticsDto().setDate("2022-09-21").setDeptName("字节").setProductName("飞书").setConsumption(new BigDecimal(100));
11         FinanceStatisticsDto dto4 = new FinanceStatisticsDto().setDate("2022-09-20").setDeptName("字节").setProductName("飞书").setConsumption(new BigDecimal(75));
12         FinanceStatisticsDto dto5 = new FinanceStatisticsDto().setDate("2022-09-21").setDeptName("字节").setProductName("抖音").setConsumption(new BigDecimal(60));
13 
14         processList.add(dto1);
15         processList.add(dto2);
16         processList.add(dto3);
17         processList.add(dto4);
18         processList.add(dto5);
19 
20         System.out.println("处理后前数据:" + JSON.toJSONString(processList));
21 
22         /**
23          * 先对产品+时间合并分组后,合并每组数据为一条(消耗相加),然后返回一个list(分组后size就是最终的返回size)
24          */
25         List<FinanceStatisticsDto> finalResult = processList.stream().collect(Collectors.groupingBy(x -> x.getProductName() + x.getDate())).values()
26                 .stream().flatMap(list -> Stream.of(list.stream().reduce((data1, data2) -> {
27                     data1.setConsumption(data1.getConsumption().add(data2.getConsumption()));
28                     return data1;
29                 }).orElse(new FinanceStatisticsDto()))).collect(Collectors.toList());
30 
31         System.out.println("处理后数据:" + JSON.toJSONString(finalResult));
32     }
33 }
View Code

运行结果

 

posted @ 2022-09-22 14:44  JustJavaIt  阅读(49)  评论(0编辑  收藏  举报