这段代码可以进行简化和优化:

  1. 可以使用Java 8的Optional来代替ObjectUtil.isNotEmpty和isEmpty的判断。

  2. 可以使用stream的filter和map方法来代替for循环中的列表遍历。

  3. 可以将BigDecimal.ZERO提取出来,避免在代码中多次使用。

  4. 可以将lambda表达式中的重复逻辑提取出来,避免代码重复。

  5. 可以将重复使用的lambda表达式提取出来,避免代码重复。

  6. 可以使用try-catch语句来处理异常,避免使用throw抛出异常。

优化后的代码如下:

public MyRecord preOrder(PreFishOrderRequest preFishOrderRequest) { Optional.ofNullable(preFishOrderRequest.getPreOrderType()) .filter(type -> type.equals("shoppingCart")) .orElseThrow(() -> new ServiceException("暂没开通其他方式"));

    Integer userId = baseService.getUserId();
    LambdaQueryWrapper<ShoppingCart> shoppingCartLambdaQueryWrapper = new LambdaQueryWrapper<>();
    shoppingCartLambdaQueryWrapper.eq(ShoppingCart::getUserId, userId)
            .eq(ShoppingCart::getShopId, preFishOrderRequest.getShopId())
            .eq(ShoppingCart::getIsDel, false)
            .eq(ShoppingCart::getIsSettlement, false);

    List<ShoppingCart> shoppingCartList = shoppingCartService.list(shoppingCartLambdaQueryWrapper);
    Optional.ofNullable(shoppingCartList)
            .filter(CollUtil::isNotEmpty)
            .orElseThrow(() -> new ServiceException("您的购物车为空无法下单"));

    DelicacyOrderInfoVo delicacyOrderInfoVo = new DelicacyOrderInfoVo();
    List<DelicacyOrderInfoDetailVo> delicacyOrderInfoDetailVos = commodityList(preFishOrderRequest, shoppingCartList, delicacyOrderInfoVo);

    BigDecimal proTotalFee = delicacyOrderInfoDetailVos.stream()
            .map(e -> e.getPrice().multiply(new BigDecimal(e.getNumber())))
            .reduce(BigDecimal.ZERO, BigDecimal::add);

    BigDecimal payFee = delicacyOrderInfoDetailVos.stream()
            .map(e -> e.getDiscount().map(discount -> e.getPrice().multiply(discount)).orElse(e.getPrice())
                    .multiply(new BigDecimal(e.getNumber())))
            .reduce(BigDecimal.ZERO, BigDecimal::add);

    Long orderProNum = delicacyOrderInfoDetailVos.stream()
            .mapToLong(DelicacyOrderInfoDetailVo::getNumber)
            .sum();

    delicacyOrderInfoVo.setProTotalFee(proTotalFee);
    delicacyOrderInfoVo.setPayFee(payFee);
    delicacyOrderInfoVo.setDiscountsMoneyFee(proTotalFee.subtract(payFee));
    delicacyOrderInfoVo.setDelicacyOrderInfoDetailVoList(delicacyOrderInfoDetailVos);
    delicacyOrderInfoVo.setOrderProNum(orderProNum);

    String key = userId + DateUtil.getNowTime().toString() + CrmebUtil.getUuid();
    cacheService.setDelicacyCachePreOrder(key, delicacyOrderInfoVo);

    return new MyRecord().set("preOrderNo", key);
}

public List<DelicacyOrderInfoDetailVo> commodityList(PreFishOrderRequest preFishOrderRequest, List<ShoppingCart> shoppingCartList, DelicacyOrderInfoVo delicacyOrderInfoVo) {
    ShopInfo shopInfo = shopInfoService.getById(preFishOrderRequest.getShopId());
    Set<Integer> dishIds = shoppingCartList.stream()
            .map(ShoppingCart::getDishId)
            .flatMap(Optional::stream)
            .collect(Collectors.toSet());

    Set<Integer> setmealIds = shoppingCartList.stream()
            .map(ShoppingCart::getSetmealId)
            .flatMap(Optional::stream)
            .collect(Collectors.toSet());

    Map<Integer, Setmeal> setmealMap = setmealService.findSetmealMapByIds(setmealIds);
    Map<Integer, DelicacyDish> delicacyDishMap = delicacyDishService.findDishMapByIds(dishIds);

    delicacyOrderInfoVo.setShopId(preFishOrderRequest.getShopId());
    delicacyOrderInfoVo.setShopName(shopInfo.getName());

    return shoppingCartList.stream()
            .map(shoppingCart -> {
                DelicacyOrderInfoDetailVo delicacyOrderInfoDetailVo = new DelicacyOrderInfoDetailVo();

                if (shoppingCart.getDishId().isPresent()) {
                    DelicacyDish delicacyDish = delicacyDishMap.get(shoppingCart.getDishId().get());
                    Optional.ofNullable(delicacyDish)
                            .orElseThrow(() -> new ServiceException("您选择的商品有误"));

                    delicacyOrderInfoDetailVo.setDishId(shoppingCart.getDishId().get());
                    delicacyOrderInfoDetailVo.setName(delicacyDish.getName());
                    delicacyOrderInfoDetailVo.setCateId(delicacyDish.getCategoryId());
                    delicacyOrderInfoDetailVo.setPrice(delicacyDish.getPrice());
                    delicacyOrderInfoDetailVo.setImage(delicacyDish.getImage());
                    delicacyOrderInfoDetailVo.setDiscount(delicacyDish.getDiscount());
                } else {
                    Setmeal setmeal = setmealMap.get(shoppingCart.getSetmealId().get());
                    Optional.ofNullable(setmeal)
                            .orElseThrow(() -> new ServiceException("您选择的套餐有误"));

                    delicacyOrderInfoDetailVo.setSetmealId(shoppingCart.getSetmealId().get());
                    delicacyOrderInfoDetailVo.setName(setmeal.getName());
                    delicacyOrderInfoDetailVo.setCateId(setmeal.getCategoryId());
                    delicacyOrderInfoDetailVo.setPrice(setmeal.getPrice());
                    delicacyOrderInfoDetailVo.setImage(setmeal.getImage());
                }

                delicacyOrderInfoDetailVo.setDishFlavor(shoppingCart.getDishFlavor());
                delicacyOrderInfoDetailVo.setNumber(shoppingCart.getNumber());

                return delicacyOrderInfoDetailVo;
            })
            .toList();
这段代码有简化 或者优化 或者有bug的地方吗 public MyRecord preOrderPreFishOrderRequest preFishOrderRequest if !preFishOrderRequestgetPreOrderTypeequalsshoppingCart throw new ServiceException暂没开通其他方式;

原文地址: https://www.cveoy.top/t/topic/egUl 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录