如何在 if 语句中使用 Optional?
How to use Optional in a if statement?
我有很多 table 个订单。对于每个订单 ID,可以有很多产品 ID。当我从数据库中获取数据时,我试图在视图对象中分别获取每个订单的所有产品。我的想法是检查 LinkedList 中最后一个元素的顺序 ID(我尝试使用该方法 return 的列表)是否与我尝试写入的下一个元素的顺序 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())
默认值似乎是 void,所以我无法将它与 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);
}
您的 orderz 链表在第一次迭代时为空。
这就是你得到 NullPointerException 的原因。
我有很多 table 个订单。对于每个订单 ID,可以有很多产品 ID。当我从数据库中获取数据时,我试图在视图对象中分别获取每个订单的所有产品。我的想法是检查 LinkedList 中最后一个元素的顺序 ID(我尝试使用该方法 return 的列表)是否与我尝试写入的下一个元素的顺序 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())
默认值似乎是 void,所以我无法将它与 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);
}
您的 orderz 链表在第一次迭代时为空。 这就是你得到 NullPointerException 的原因。