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
。忽略所有其他步骤。
目前我正在使用以下格式的 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
。忽略所有其他步骤。