我有一个多对多的订单表。对于每个订单 ID,可以有很多产品 ID。当我从 db 获取数据时,我试图分别在视图对象中获取每个订单的所有产品。这个想法是检查 LinkedList 中最后一个元素的订单 ID(我试图用该方法返回的列表)是否与我试图写入列表的下一个元素的订单 ID 相同。如果订单相同,我会向该订单添加另一个产品,如果不是,我会使用其产品创建新订单。
public List<OrderVO> getOrders(int id) {
List<Orders> orders = orderRepository.findByUserId(id);
List<OrderProduct> orderProduct = new ArrayList<>();
for (Orders o : orders) orderProduct = orderProductRepository.findByOrderId(o.getId());
LinkedList<OrderVO> orderz = new LinkedList<>();
for (OrderProduct op : orderProduct) {
OrderVO order = new OrderVO(Long.valueOf(op.getOrders().getId()));
Optional<Product> pResponse = productRepository.findById(op.getProduct().getId());
Product p = pResponse.get();
ProductVO pVO = new ProductVO(p.getId(), p.getName(), op.getAmountOfOrderedProduct());
if (orderz.peekLast().getId() == order.getId()) {
OrderVO o = orderz.getLast();
o.getOrderProducts().add(pVO);
orderz.addLast(o);
} else {
order.getOrderProducts().add(pVO);
orderz.addLast(order);
}
}
return orderz;
}
问题是orderz.peekLast().getId()
第一次迭代总是抛出空指针异常。所以我试着用一个像这样的可选来优雅地检查它是否为空:
Optional<LinkedList<OrderVO>> orderz = Optional.ofNullable(new LinkedList<>());
.
.
.
if (orderz.ifPresent(orderVOS -> orderz.get().peekLast().getId()) == order.getId()) {
OrderVO o = orderz.get().getLast();
o.getOrderProducts().add(pVO);
orderz.get().addLast(o);
} else {
order.getOrderProducts().add(pVO);
orderz.get().addLast(order);
}
虽然似乎orderz.ifPresent(orderVOS -> orderz.get().peekLast().getId())
默认值是无效的,所以我无法将它与 int 进行比较。具有讽刺意味的是,我试图让我的代码尽可能干净。任何有关如何处理这段代码的其他建议将不胜感激。
您似乎没有阅读过 Java API,因为那时您可能已经看到它ifPresent
用于有条件地执行给定的代码(ifPresent
如果Optional
存在)。您正在搜索的内容类似于
if (orderz.peekLast() == null || orderz.peekLast().getId() != order.getId()) {
order.getOrderProducts().add(pVO);
orderz.addLast(order);
} else {
OrderVO o = orderz.getLast();
o.getOrderProducts().add(pVO);
orderz.addLast(o);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句