首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >报告购物车总额

报告购物车总额
EN

Code Review用户
提问于 2018-12-19 15:55:40
回答 2查看 116关注 0票数 1

我有一个对象(ShoppingCart),它有一个CartItems的列表,其中包含了相关的Product和购买的数量。

代码语言:javascript
复制
public class ShoppingCart extends BaseEntity {

    @OneToMany(mappedBy = "shoppingCart", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<CartItem> cartItems = new ArrayList<>();

    @DateTimeFormat(pattern = "dd/MM/yyyy hh:MM:ss")
    private LocalDateTime dateTime;

    @Enumerated
    private PaymentMethod paymentMethod = PaymentMethod.CASH;
代码语言:javascript
复制
public class CartItem extends BaseEntity {

    @ManyToOne
    private Product product;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn
    private ShoppingCart shoppingCart;
代码语言:javascript
复制
public class Product extends BaseEntity {

    @NotEmpty
    private String name;

    private double price;

    private int quantity;

我有一个观点,认为所有购物车的总和,我不知道我是否应该存储在ShoppingCart实体中的和,或迭代,以找到和。这是代码,现在我正在迭代。

代码语言:javascript
复制
@GetMapping("/")
    public String getProduct(@ModelAttribute("reportDto") ReportDto reportDto, Model model) {

        double total = 0, cash = 0, credit = 0, debit = 0;
        int quantity;
        List<ShoppingCart> results;
        if (reportDto.getBeginDate() == null || reportDto.getEndDate() == null) {
            results = shoppingCartService.findAll();
        } else {
            results = shoppingCartService.findByDateTimeBetween(reportDto.getBeginDate(), reportDto.getEndDate());
        }
        total = results.stream()
                .mapToDouble(shoppingCart -> shoppingCart.getCartItems().stream()
                        .mapToDouble(cartItem -> cartItem.getProduct().getPrice() * cartItem.getQuantity()).sum())
                .sum();
        quantity = results.stream().mapToInt(
                shoppingCart -> shoppingCart.getCartItems().stream().mapToInt(cartItem -> cartItem.getQuantity()).sum())
                .sum();

        cash = results.stream().filter(shoppingCart -> shoppingCart.getPaymentMethod().isCash())
                .mapToDouble(shoppingCart -> shoppingCart.getCartItems().stream()
                        .mapToDouble(cartItem -> cartItem.getProduct().getPrice() * cartItem.getQuantity()).sum())
                .sum();

        credit = results.stream().filter(shoppingCart -> shoppingCart.getPaymentMethod().isCredit())
                .mapToDouble(shoppingCart -> shoppingCart.getCartItems().stream()
                        .mapToDouble(cartItem -> cartItem.getProduct().getPrice() * cartItem.getQuantity()).sum())
                .sum();

        debit = results.stream().filter(shoppingCart -> shoppingCart.getPaymentMethod().isDebit())
                .mapToDouble(shoppingCart -> shoppingCart.getCartItems().stream()
                        .mapToDouble(cartItem -> cartItem.getProduct().getPrice() * cartItem.getQuantity()).sum())
                .sum();
        model.addAttribute("quantity", quantity);
        model.addAttribute("cash", cash);
        model.addAttribute("credit", credit);
        model.addAttribute("debit", debit);
        model.addAttribute("total", total);
        return "reports/reports";
    }

此外,任何有关代码的反馈将不胜感激!

EN

回答 2

Code Review用户

回答已采纳

发布于 2018-12-20 06:56:53

首先,我认为在您的数据库中创建一个汇总您的需求的视图会更好,因为一般来说,sql引擎sum操作符的性能要比编程语言中的值好得多。

第二,如果我们遍历您的代码:您已经逐一完成了对所有对象的映射。Java流映射与编译时的for循环类似。因此,在这里,您所做的类似于创建for循环foreach对象,这不利于性能。为了提高性能,您可以创建一个for循环并在其中生成您的和值。

注意: BigDecimal是在Java中存储双货币值的首选方法

票数 1
EN

Code Review用户

发布于 2018-12-20 06:56:47

ShoppingCart中存储和或计算它取决于您。我将计算它的每一次,并最终“缓存”它如果有很多项目。

但是,通过在ShoppingCart本身中强制封装和移动所有这些计算代码,您的代码将更易于维护。您还可以通过在getUnitPrice():doublegetPrice()中添加CartItem来继续进行封装。

--

请注意,double不是一个好的货币类型。

票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/209984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档