如何在 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 的原因。