Как использовать Optional в операторе if? - PullRequest
0 голосов
/ 26 марта 2020

У меня есть таблица заказов много-много. Для каждого идентификатора заказа может быть много идентификаторов продукта. Когда я получаю данные из базы данных, я пытаюсь получить все продукты для каждого заказа соответственно в виде объекта. Идея состояла в том, чтобы проверить, совпадает ли идентификатор заказа последнего элемента в LinkedList (список, который я пытаюсь вернуть с помощью метода) с идентификатором заказа следующего элемента, который я пытаюсь записать в список. Если заказ такой же, я добавляю другой продукт в этот заказ, если нет, я делаю новый заказ с его продуктом.

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()) defualt является недействительным, поэтому я не могу сравнить его с целым числом. По иронии судьбы для этого я стараюсь сохранить свой код как можно более чистым. Буду признателен за любые другие предложения по исправлению этого фрагмента кода.

Ответы [ 2 ]

2 голосов
/ 26 марта 2020

Похоже, вы не читали API Java, потому что тогда вы могли видеть, что 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);
}
0 голосов
/ 26 марта 2020

Ваш список ссылок orderz пуст на первой итерации. Вот почему вы получаете исключение NullPointerException.

...