lambda表达式与list

2019-08-16  本文已影响0人  柒月姐姐a

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

因为刚刚开始接触,比较生疏,目前只能这样优化了,将嵌套的循环改为单层,以后在逐渐琢磨。
特此记录。

上一篇 下一篇

猜你喜欢

热点阅读