1. 程式人生 > 實用技巧 >java8 Stream 多天條件分組統計

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;
}
}

測試結果: