Конвертировать дополнительно в логическое значение в функциональном стиле - PullRequest
0 голосов
/ 25 октября 2018

Я просто хотел вернуть boolean от объекта Optional, выполнив проверку getProductType() объекта ProductDetails, как показано ниже:

public boolean isElectronicProduct(String productName) {
    Optional<ProductDetails> optProductDetails = findProductDetails(productName);
    if(optProductDetails.isPresent()) {
        return optProductDetails.get().getProductType() == ProductType.ELECTRONICS;
    }
    return false;
}

Intellij жалуется, чтоприведенный выше код можно заменить в функциональном стиле, есть ли способ упростить вышеуказанный Optional объект и вернуть boolean?

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Измените это:

if(optProductDetails.isPresent()) {
    return optProductDetails.get().getProductType() == ProductType.ELECTRONICS;
}
return false;

На :

return optProductDetails
      .filter(prodDet -> prodDet.getProductType() == ProductType.ELECTRONICS)  // Optional<ProductDetails> which match the criteria
      .isPresent();   // boolean

Подробнее об операциях в функциональном стиле для значений Optional можно узнать по адресу: https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html

0 голосов
/ 25 октября 2018

Это то, что вам нужно:

return findProductDetails(productName)
    .map(ProductDetails::getProductType)
    .map(ProductType.ELECTRONICS::equals)
    .orElse(false);

Я предпочитаю разделить вещи с помощью дополнительного вызова map, а не вызова productDetails.getProductType() непосредственно перед сравнением.Я думаю, что это немного легче читать.

0 голосов
/ 25 октября 2018
optProductDetails.map(d -> d.getProductType() == ProductType.ELECTRONICS) //Optional<Boolean>
                 .orElse(false); //Boolean
...