Java流检查空值
我想把这段代码转换成流Java流检查空值,java,java-stream,Java,Java Stream,我想把这段代码转换成流 List<ECSUSU> listOfUSUs = msccRequest.getUsedServiceUnit(); if (listOfUSUs != null) { ECSUSU usedServiceUnit = listOfUSUs.get(0); if (usedServiceUnit.getCcTime() != null && usedServiceUnit.getCcTime() > 0) {
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;
}
}
过滤器
应用于流
的单个元素(一个流
迭代列表中的每个元素),因此如果mscrequest.getUsedServiceUnit()
返回null
,.Stream()
调用将抛出一个NPE。如果您需要确保列表本身不是null
,我建议您将其包装在可选的
中,如下所示:
Optional<List<ECSUSU>> list = Optional.ofNullable(msccRequest.getUsedServiceUnit())
etc如果
mscrequest.getUsedServiceUnit()
返回null
,则尝试调用stream()
方法将抛出NullPointerException
。我希望NPE就是从这一点来的。在调用stream()
方法之前,需要检查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 */);
}
List listOfUSUs=mscrequest.getUsedServiceUnit();
if(listOfUSUs!=null){
返回listOfUSUs.stream()
.filter(对象::非空)
.findFirst()
.map(usedServiceUnit->{
if(usedServiceUnit.getCcTime()!=null&&usedServiceUnit.getCcTime()>0){
返回UnitType.SECONDS;
}否则{
返回UnitType.BYTES;
}
})
.orElse(/*默认值*/);
}
是的,但是为什么不使用标准的if语句,并且仅当列表不为空时才执行流操作呢<代码>列表listOfUSUs=mscrequest.getUsedServiceUnit();if(listOfUSUs!=null)//do stream stuff如果您更喜欢非功能性方法,这是一个选项(双关语)。由于OP想要转换为流
,我只是以同样的方式扩展了它。谢谢,我没有机会尝试这个,我会尽快回复。谢谢,我没有机会尝试这个,我会尽快回复。
list.ifPresent(notNullListForSure -> notNullListForSure.stream())
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 */);
}