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;
}
}
测试结果:
原文:https://www.cnblogs.com/LifeFruit/p/13290285.html