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