• 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

    运行结果

  • 相关阅读:
    static&初始化顺序
    java基础语法
    MySQL调优
    Nnginx调优
    cisco 一些基本命令
    路由器密码忘记
    利用GetPrivateProfileString读取配置文件(.ini)
    MFC中OnActivate函数解析
    在MFC应用程序中传输的消息类型
    MFC中UpdateData函数解析
  • 原文地址:https://www.cnblogs.com/liaowenhui/p/16719231.html
Copyright © 2020-2023  润新知