[英]Java Streams checking for nulls
我想將這段代碼轉換成流
List<ECSUSU> listOfUSUs = msccRequest.getUsedServiceUnit();
if (listOfUSUs != null) {
ECSUSU usedServiceUnit = listOfUSUs.get(0);
if (usedServiceUnit.getCcTime() != null && usedServiceUnit.getCcTime() > 0) {
return UnitType.SECONDS;
} else {
return UnitType.BYTES;
}
}
我以為這會工作,但我得到NullPointerException。 msccRequest.getUsedServiceUnit()可能返回null,這就是我需要檢查的原因
msccRequest.getUsedServiceUnit().stream()
.filter(list -> list != null)
.limit(1)
.map(usedServiceUnit -> {
if (usedServiceUnit.getCcTime() != null && usedServiceUnit.getCcTime() > 0) {
return UnitType.SECONDS;
} else {
return UnitType.BYTES;
}
});
filter
應用於Stream
各個元素( Stream
迭代列表中的每個元素),因此如果msccRequest.getUsedServiceUnit()
返回null
,則.stream()
調用將拋出NPE。 如果你需要確保列表本身不為null
,我建議你將它包裝在Optional
,如下所示:
Optional<List<ECSUSU>> list = Optional.ofNullable(msccRequest.getUsedServiceUnit())
然后使用ifPresent
實現迭代:
list.ifPresent(notNullListForSure -> notNullListForSure.stream())
等等
如果msccRequest.getUsedServiceUnit()
返回null
,則嘗試在其上調用stream()
方法將拋出NullPointerException
。 我希望NPE來自於此。 在調用stream()
方法之前,需要檢查null。
另請注意,您的兩段代碼不相同(即使上述問題已修復)。 第一個代碼僅檢查列表的第一個元素,而第二個代碼檢索第一個非null元素。
此外,您只對列表中的單個元素感興趣。 然后findFirst
似乎是一個比limit
更好的選擇。
List<ECSUSU> listOfUSUs = msccRequest.getUsedServiceUnit();
if (listOfUSUs != null) {
return listOfUSUs.stream()
.filter(Objects::nonNull)
.findFirst()
.map(usedServiceUnit -> {
if (usedServiceUnit.getCcTime() != null && usedServiceUnit.getCcTime() > 0) {
return UnitType.SECONDS;
} else {
return UnitType.BYTES;
}
})
.orElse(/* default value */);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.