簡體   English   中英

Java Streams檢查空值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM