如何在if语句中使用Optional?

耕作

我有一个多对多的订单表。对于每个订单 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章