
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; } } 測試結果: