java 8新特性 lambda表达式
项目中尽量避免循环嵌套,可以采用lambda表达式对list进行处理
下面是我写的原代码,for循环中嵌套for循环,性能肯定低。最近公司在优化代码,也开始研究lambda表达式了,感觉还是很好用,对list的处理极为灵活。
//查询所有未完成的订单
List<Transaction> transactionList = transactionRepository.findAllByPayStatus(0);
log.info("未支付交易单数量为:[{}],单号为:[{}]"+transactionList.size());
for (Transaction transaction:transactionList
) {
//当前时间与下单时间+30分钟比较
log.info("当前时间:"+new Date());
Date orderTime = DateUtils.addMinute(transaction.getCreateTime(),30);
log.info("取消订单时间:"+orderTime);
if(DateUtils.compareDate(DateUtils.dateToStrLong(new Date()),DateUtils.dateToStrLong(orderTime))>0 ){
List<Order> orderList = orderRepository.findAllByTranId(transaction.getId());
for (Order order:orderList
) {
order.setOrderStatus(6);
orderRepository.save(order);
//调用库存方法 将占用的库存恢复
orderService.updateGoodsStock(order,1);
}
transaction.setTransactionStatus(6);
transaction.setPayStatus(-1);
transactionRepository.save(transaction);
}
}
修改后的代码:
//查询所有未完成的订单
List<Transaction> transactionList = transactionRepository.findAllByPayStatus(0);
log.info("未支付交易单数量为:[{}]",transactionList.size());
List<Long> tranId = transactionList.stream().map(s -> {
//当前时间与下单时间+30分钟比较
log.info("当前时间:",DateUtil.date());
Date orderTime = DateUtils.addMinute(s.getCreateTime(),30);
log.info("取消订单时间:",DateUtil.date(orderTime));
if (DateUtils.compareDate(DateUtils.dateToStrLong(new Date()), DateUtils.dateToStrLong(orderTime)) > 0) {
s.setTransactionStatus(6);
s.setPayStatus(-1);
transactionRepository.saveAndFlush(s);
return s.getId();
} else {
return null;
}
}).collect(Collectors.toList());
tranId.remove(null);
log.info("需要取消订单的单号为:[{}]",tranId);
if(tranId.size()>0){
List<Order> orderList = orderRepository.findByTranIdIn(tranId);
orderList.forEach(s -> {
s.setOrderStatus(6);
orderRepository.save(s);
//调用库存方法 将占用的库存恢复
orderService.updateGoodsStock(s,1);
});
}
因为刚刚开始接触,比较生疏,目前只能这样优化了,将嵌套的循环改为单层,以后在逐渐琢磨。
特此记录。
网友评论