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

}

}

测试结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值