1. map的使用
String orderSns = mediumSettleListVoList.stream().map(MediumSettleSearch::getSn).distinct().collect(Collectors.joining(","));
2.filter的使用
List<OrderIODO> orderIODOList = orderIODOS.stream().filter(vo -> {
return vo.getOrderSn().equals(mediumSettleSearch.getSn());
}).collect(Collectors.toList());
3.排序
if (!CollectionUtils.isEmpty(orderIODOList)) {
orderIODOList.sort(Comparator.comparingLong(OrderIODO::getIoTime));
}
orderIODOSettleTimeNotNUll.sort(Comparator.comparingLong(OrderIODO::getSettleTime)); //按确认收钱的时间排序
4.统计
Double rangAmount = rangeList.stream().mapToDouble(OrderIODO::getIoAmount).sum();
5.取两个list的差集
/**
* 根据id取两个list的差集
* @param list1
* @param list2
* @return
*/
private List<OrderIODO> getDistinctListById(List<OrderIODO> list1, List<OrderIODO> list2) {
List<OrderIODO> distinctList = list1.stream()
.filter(vo->!list2.stream()
.map(e->e.getId())
.collect(Collectors.toList())
.contains(vo.getId())).collect(Collectors.toList());
return distinctList;
}
6. 分组统计
/**
* 根据支付渠道分组获取支付总额
*
* @param orderIODOList
* @return
*/
private List<PaymentChannelVO> getPaymentChannelGroup(List<OrderIODO> orderIODOList) {
List<PaymentChannelVO> paymentChannelVOS = new ArrayList<>();
Map<String, DoubleSummaryStatistics> amountGroupByChannel = orderIODOList.stream().collect(Collectors.groupingBy(OrderIODO::getIoChannel, Collectors.summarizingDouble(OrderIODO::getIoAmount))); //分组统计
for (Map.Entry<String, DoubleSummaryStatistics> entry : amountGroupByChannel.entrySet()) {
DoubleSummaryStatistics doubleSummaryStatistics = entry.getValue();
PaymentChannelVO paymentChannelVO = new PaymentChannelVO();
paymentChannelVO.setChannel(entry.getKey());
Double amount = doubleSummaryStatistics.getSum();
double round = CurrencyUtil.round(amount, 2);
paymentChannelVO.setNum(round);
paymentChannelVOS.add(paymentChannelVO);
}
return paymentChannelVOS;
}
第二种分组方式:
/ java8之前。从map中根据key获取value操作可能会有下面的操作
Object key = map.get("key");
if (key == null) {
key = new Object();
map.put("key", key);
}
// java8之后。上面的操作可以简化为一行,若key对应的value为空,会将第二个参数的返回值存入并返回
Object key2 = map.computeIfAbsent("key", k -> new Object());
Map<String,Double> map=new HashMap<>();
for (OrderIODO orderIODO : list) {
Double v = map.computeIfAbsent(orderIODO.getIoChannel(), k -> 0d);
//如果orderIODO.getIoChannel() 不存在,就把k -> 0设置成key对应的值并返回
v+=orderIODO.getIoAmount();
map.put(orderIODO.getIoChannel(),v); //覆盖原来的值,实现分组统计
}
7.拼接字符串
String orderSnsStr = mediumSettleListVos.stream().map(MediumSettleListVo::getOrderSn).distinct().collect(Collectors.joining(","));
List<OrderSettleDO> orderSettleDOS = daoSupport.queryForList("select * from ns_order_settle where order_sn in (" + orderSnsStr + ")", OrderSettleDO.class);
- 取settletime最大的一条记录
long settleTime = settleIO.stream().mapToLong(OrderIODO::getSettleTime).max().getAsLong();