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 */);
}