需求分析
同一公司,同一产品可能有多条广告计划,每条广告计划的消耗不同,财务统计页面需要按天统计不同产品的消耗总和。
示例说明
处理前:
[{"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),同一个产品(飞书)产生的消耗,最终合并为合并后的第一条。
代码示例
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }