首页 > 编程语言 > 详细

java8 Stream 多天条件分组统计

时间:2020-07-12 22:30:46      阅读:428      评论:0      收藏:0      [点我收藏+]
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;
}
}

测试结果:

技术分享图片




java8 Stream 多天条件分组统计

原文:https://www.cnblogs.com/LifeFruit/p/13290285.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!