[英]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.