我想将这段代码转换为流
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;
}
});
答案 0 :(得分:2)
filter
适用于Stream
的各个元素(A Stream
遍历列表中的每个元素),因此如果msccRequest.getUsedServiceUnit()
返回null
, .stream()
调用将引发NPE。如果您需要确保列表本身不是null
,我建议您将其包装在Optional
中,如下所示:
Optional<List<ECSUSU>> list = Optional.ofNullable(msccRequest.getUsedServiceUnit())
然后使用ifPresent
来实现迭代:
list.ifPresent(notNullListForSure -> notNullListForSure.stream())
等
答案 1 :(得分:1)
如果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 */);
}