java stream 按月(日期Date)分组统计

首先是上一个简单的数据模型
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Staff {
    //姓名
    String name;
    //生产日期
    Date date;
    //产量
    BigDecimal yield;
}

员工模型分别有 字符类型的名称,Date类型生产日期,BigDecimal类型的产量

需求,根据提供的数据List集合按月统计数据,求每月生产总量
 
    public static void main(String[] args) {
        List<Staff> staffList=new ArrayList<>();
        staffList.add(new Staff("张三", DateUtil.parse("2022-01-01","yyyy-MM-dd"),new BigDecimal(10)));
        staffList.add(new Staff("张三", DateUtil.parse("2022-01-02","yyyy-MM-dd"),new BigDecimal(14)));
        staffList.add(new Staff("张三", DateUtil.parse("2022-01-03","yyyy-MM-dd"),new BigDecimal(11)));
        staffList.add(new Staff("张三", DateUtil.parse("2022-02-03","yyyy-MM-dd"),new BigDecimal(10)));
        staffList.add(new Staff("张三", DateUtil.parse("2022-02-04","yyyy-MM-dd"),new BigDecimal(10)));

        //求每月对于生产总量
        Map<String, BigDecimal> yieldMonthMap = staffList.stream().collect(
                Collectors.groupingBy(
                        o -> DateUtil.format(o.getDate(), "yyyy-MM"),
                        Collectors.mapping(Staff::getYield, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))
                ));
        System.out.println(yieldMonthMap);

    }

上方代码首先是构建模拟数据,然后进按月行分组统计,最终输出结果:
输出结果
按月分组统计结果

 

评论区域