我有一个对象(ShoppingCart),它有一个CartItems的列表,其中包含了相关的Product和购买的数量。
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;public class CartItem extends BaseEntity {
@ManyToOne
private Product product;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn
private ShoppingCart shoppingCart;public class Product extends BaseEntity {
@NotEmpty
private String name;
private double price;
private int quantity;我有一个观点,认为所有购物车的总和,我不知道我是否应该存储在ShoppingCart实体中的和,或迭代,以找到和。这是代码,现在我正在迭代。
@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";
}此外,任何有关代码的反馈将不胜感激!
发布于 2018-12-20 06:56:53
首先,我认为在您的数据库中创建一个汇总您的需求的视图会更好,因为一般来说,sql引擎sum操作符的性能要比编程语言中的值好得多。
第二,如果我们遍历您的代码:您已经逐一完成了对所有对象的映射。Java流映射与编译时的for循环类似。因此,在这里,您所做的类似于创建for循环foreach对象,这不利于性能。为了提高性能,您可以创建一个for循环并在其中生成您的和值。
注意: BigDecimal是在Java中存储双货币值的首选方法
发布于 2018-12-20 06:56:47
在ShoppingCart中存储和或计算它取决于您。我将计算它的每一次,并最终“缓存”它如果有很多项目。
但是,通过在ShoppingCart本身中强制封装和移动所有这些计算代码,您的代码将更易于维护。您还可以通过在getUnitPrice():double和getPrice()中添加CartItem来继续进行封装。
--
请注意,double不是一个好的货币类型。
https://codereview.stackexchange.com/questions/209984
复制相似问题