Выполняет левое внешнее соединение в незащищенном наборе в той же базе данных для фильтрации в документах из «объединенной» коллекции для обработки. Для каждого входного документа этап $ lookup добавляет новое поле массива, элементы которого являются соответствующими документами из «объединенной» коллекции. Эта стадия $ lookup передает эти измененные документы на следующий этап. Этап $ lookup имеет следующие синтаксисы:
Чтобы выполнить совпадение равенства между полем из входных документов с полем из документов «объединенной» коллекции, этап $ lookup имеет следующий синтаксис:
{
$lookup:
{
from: ,
localField: ,
foreignField: ,
as:
Операция будет соответствовать следующему выражению псевдо-SQL:
SELECT *,
Используйте 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
:
Если значение присутствует, примените к нему предоставленную функцию отображения, и, если результат не равен нулю, верните опциональное описание результата. В противном случае верните пустой необязательный.
BLOCKQUOTE>
Вроде как комбинация ответов выше, вы можете использовать как потоки, так и дополнительные (плюс это однострочный).
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());
}
Вы также можете использовать 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()));
}
Просто передайте список позиций заказа, сопоставьте его с продуктом и проверьте, существует ли продукт с данным именем.