Конвертировать пустые проверки в Необязательные

$ lookup (aggregation)

Выполняет левое внешнее соединение в незащищенном наборе в той же базе данных для фильтрации в документах из «объединенной» коллекции для обработки. Для каждого входного документа этап $ lookup добавляет новое поле массива, элементы которого являются соответствующими документами из «объединенной» коллекции. Эта стадия $ lookup передает эти измененные документы на следующий этап. Этап $ lookup имеет следующие синтаксисы:

Equality Match

Чтобы выполнить совпадение равенства между полем из входных документов с полем из документов «объединенной» коллекции, этап $ lookup имеет следующий синтаксис:

{
   $lookup:
     {
       from: ,
       localField: ,
       foreignField: ,
       as: 
     }
}

Операция будет соответствовать следующему выражению псевдо-SQL:

SELECT *, 
FROM collection
WHERE  IN (SELECT 
                               FROM 
                               WHERE  );

Mongo URL

1
задан Dale Burrell 18 March 2019 в 01:07
поделиться

3 ответа

Используйте Optional.ofNullable и Optional.map :

for(OrderItem item : orderItems) {
    Optional<String> prod = Optional.ofNullable(item)
            .map(OrderItem::getProduct)
            .map(Product::getProductName)
            .filter(s -> s.equals(prodName));

    if (prod.isPresent()) {
        return true;
    }
}
return false;

См. Javadoc для Optional.map:

Если значение присутствует, примените к нему предоставленную функцию отображения, и, если результат не равен нулю, верните опциональное описание результата. В противном случае верните пустой необязательный.

0
ответ дан Ruslan 18 March 2019 в 01:07
поделиться

Вроде как комбинация ответов выше, вы можете использовать как потоки, так и дополнительные (плюс это однострочный).

private boolean findProduct(String prodName) {
        return orderItems.stream()
                .map(Optional::ofNullable)
                .anyMatch(o -> o
                        .map(OrderItem::getProduct)
                        .map(Product::getProductName)
                        .map(s -> s.equals(prodName))
                        .isPresent());
}
0
ответ дан Luca Cucchetti 18 March 2019 в 01:07
поделиться

Вы также можете использовать Stream API, чтобы выполнить то, что вы хотите

public boolean findProductOptional(String productName) {
   return orderItems
     .stream()
     .filter(Objects::nonNull)
     .map(OrderItem::getProduct)
     .filter(Objects::nonNull)
     .anyMatch(product -> productName.equals(product.getProductName()));
}

Просто передайте список позиций заказа, сопоставьте его с продуктом и проверьте, существует ли продукт с данным именем.

0
ответ дан Aris_Kortex 18 March 2019 в 01:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: