簡體   English   中英

Java8 Lambda嵌套null檢查

[英]Java8 lambda nested null check

當前,我正在使用以下格式的Optional值:是否可以進一步減少代碼?

final Optional<List<ServiceAttributeValue>> attributeValueList = Optional.<Product> of(product)
         .map(Product::getServiceAttributes)
         .map(ServiceAttributeMap::getMap)
         .map((v) -> (ServiceAttribute) v.get(attributeV.getAttributeString()))
         .map((c) -> (List<ServiceAttributeValue>) c.getValueList());

if (!attributeValueList.isPresent()) {
    return null;
}

final Optional<ServiceAttributeValue> value = attributeValueList.get().stream()
         .filter((attribute) -> StringUtils.equals(attribute.getFoo(), attributeV.getBar()))
         .findFirst();

if (value.isPresent()) {
     return value.get().bar();
}

return null;

首先,如果您已經在使用Optional ,則應避免返回null 相反,空的Optional應該指示該元素丟失。

Optional::map僅會映射該值(如果存在)。 因此,無需檢查值是否為isPresent然后重新運行null ,可以將其簡化為

attributeValueList.flatMap(values -> values.stream().filter((attribute) -> StringUtils.equals(attribute.getFoo(), attributeV.getBar()).findFirst())
...

您也可以將其更改為第二個isPresent檢查。

return value.map(x -> x.bar());

整體看起來像這樣(未經測試,因為我不知道這些類):

return Optional.<Product>of(product)
        .map(Product::getServiceAttributes)
        .map(ServiceAttributeMap::getMap)
        .map((v) -> (ServiceAttribute) v.get(attributeV.getAttributeString()))
        .map(c::getValueList)
        .flatMap(values -> values
            .stream()
            .filter((attribute) -> StringUtils.equals(attribute.getFoo(), attributeV.getBar()))
            .findFirst())
        .map(x -> x.bar());

這樣做的積極效果是,當其中一個步驟未返回任何內容時,您的函數將返回一個空的Optional 所有其他步驟都將被忽略。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM