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

posted @ 2020-07-12 22:14  生命树gyh  阅读(3308)  评论(0编辑  收藏  举报
© 2020 GitHub, Inc.