zoukankan      html  css  js  c++  java
  • java8 Stream 多条件分组统计

    SettleVO类
    @Data
    @ToString
    public class SettleVO implements Serializable {
    
        private Long id;
    
        /**
         * 日期
         */
        private String sendDate;
    
        /**
         * 始发中心所在的城市
         */
        private String startCityId;
    
        /**
         * 始发城市名称
         */
        private String startCityName;
    
        /**
         * 目的城市
         */
        private String endCityId;
    
        /**
         * 目的城市名称
         */
        private String endCityName;
    
        /**
         * 耗时
         */
        private BigDecimal timeConsuming;
        /**
         * 机票价格
         */
        private Double ticketPrice;
    
        /**
         * 公里数
         */
        private Integer distance;
    
    }
    
    SettleGroupVO类
    @Data
    @ToString
    public class SettleGroupVO implements Serializable {
        /**
         *耗时
         */
        private BigDecimal timeConsuming;
        /**
         * 机票价格
         */
        private Double ticketPrice;
    
        /**
         * 公里数
         */
        private Integer distance;
    
    }
    
    主函数:
    public class StaticService {
        public static void main(String[] args) {
            //制造测试数据
            List<SettleVO> settleVOList = new ArrayList<>();
            for (int i = 10; i < 30; i++) {
                final SettleVO settleVO = new SettleVO();
                settleVO.setSendDate("2020-07-" + String.valueOf(i));
                settleVO.setStartCityId("100" + (i % 5));
                settleVO.setEndCityId("200" + (i % 5));
                settleVO.setTicketPrice((double) (i % 5));
                settleVO.setTimeConsuming(new BigDecimal(i % 5));
                settleVO.setDistance(100 * (i % 5));
                settleVOList.add(settleVO);
            }
    
            //按照维度分组统计
            final Map<SettleVO, SettleGroupVO> groupVOMap = settleVOList.stream()
                    .collect(Collectors.groupingBy(n -> getGroupKey(n), Collectors.collectingAndThen(Collectors.toList(), m -> {
                        final Double ticketPrice = m.stream().mapToDouble(SettleVO::getTicketPrice).sum();
                        final BigDecimal timeConsuming = m.stream().map(e -> e.getTimeConsuming()).reduce(BigDecimal::add).get();
                        final Integer distance = m.stream().mapToInt(SettleVO::getDistance).sum();
                        SettleGroupVO settleGroupVO = new SettleGroupVO();
                        settleGroupVO.setTicketPrice(ticketPrice);
                        settleGroupVO.setTimeConsuming(timeConsuming);
                        settleGroupVO.setDistance(distance);
                        return settleGroupVO;
                    })));
            System.out.println("groupByMap=" + groupVOMap.size());
            groupVOMap.forEach((k, v) -> {
                System.out.println(k.toString());
                System.out.println(v.toString());
            });
    
        }
        //获取分组维度
        private static SettleVO getGroupKey(final SettleVO vo) {
            final SettleVO groupKey = new SettleVO();
            groupKey.setSendDate(vo.getSendDate());
            groupKey.setStartCityId(vo.getStartCityId());
            groupKey.setEndCityId(vo.getEndCityId());
            return groupKey;
        }
    }
    
    测试结果:
    View Code

  • 相关阅读:
    5个最好用AngularJS构建应用程序框架
    5款最好的免费在线网站CSS验证器
    10款最优秀的开源移动开发工具
    10个最好的免费PS图象处理软件方案
    10个基本的HTML5动画工具设计
    6款最好的免费在线二维码生成器
    Redis配置文件参数说明
    Redis学习手册(主从复制)
    java.lang.OutOfMemoryError: PermGen space PermGen space & java.lang.OutOfMemoryError: Java heap space Heap siz
    TNSNAMES.ORA 配置
  • 原文地址:https://www.cnblogs.com/LifeFruit/p/13290285.html
Copyright © 2011-2022 走看看