繁体   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