Java Streams检查空值

时间:2016-01-29 12:19:07

标签: java java-stream

我想将这段代码转换为流

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

2 个答案:

答案 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 */);
}
相关问题