Java8 lambda 嵌套空检查

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,则应避免使用 return 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());

这样做的积极效果是,当其中一个步骤没有 return 任何内容时,您的函数 return 是一个空的 Optional。忽略所有其他步骤。