Конвертировать пустые проверки в Необязательные - PullRequest
1 голос
/ 18 марта 2019

Я не понимаю, как функционально изменить эти проверки на ноль с помощью Optional:

private boolean findProduct(String prodName) {
    for(OrderItem item : orderItems) {
        if(item != null) {
            Product p=item.getProduct();
            if(p != null) {
                String name = p.getProductName();
                if(name != null) {
                    if(name.equals(prodName)) return true;
                }
            }
        }
    }
    return false;       
}

Ответы [ 3 ]

4 голосов
/ 18 марта 2019

Использование 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:

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

2 голосов
/ 18 марта 2019

Вы также можете использовать 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 голосов
/ 18 марта 2019

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

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());
}
...