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

  • 相关阅读:
    EXCEL某列长度超过255个字符导入SQL SERVER2005的处理方法
    正则同时获取a标签里的href,text 2项
    火柴棍
    特殊数
    骨牌铺方格
    拼图
    挑战题之排列生成
    模拟 找规律
    sort
    贪心 简单背包问题
  • 原文地址:https://www.cnblogs.com/LifeFruit/p/13290285.html
Copyright © 2011-2022 走看看