簡體   English   中英

Java 8 中的多個空檢查

[英]Multiple null checks in Java 8

我有下面的代碼,對於多個空檢查來說有點難看。

String s = null;

if (str1 != null) {
    s = str1;
} else if (str2 != null) {
    s = str2;
} else if (str3 != null) {
    s = str3;
} else {
    s = str4;
}

所以我嘗試使用Optional.ofNullable如下所示,但如果有人閱讀我的代碼仍然很難理解。 在 Java 8 中做到這一點的最佳方法是什么。

String s = Optional.ofNullable(str1)
                   .orElse(Optional.ofNullable(str2)
                                   .orElse(Optional.ofNullable(str3)
                                                   .orElse(str4)));

在 Java 9 中,我們可以將Optional.ofNullableOR一起使用,但是在 Java8 中還有其他方法嗎?

你可以這樣做:

String s = Stream.of(str1, str2, str3)
    .filter(Objects::nonNull)
    .findFirst()
    .orElse(str4);

三元條件運算符怎么樣?

String s = 
    str1 != null ? str1 : 
    str2 != null ? str2 : 
    str3 != null ? str3 : str4
;

您還可以使用循環:

String[] strings = {str1, str2, str3, str4};
for(String str : strings) {
    s = str;
    if(s != null) break;
}

當前的答案很好,但您確實應該將其放入實用程序方法中:

public static Optional<String> firstNonNull(String... strings) {
    return Arrays.stream(strings)
            .filter(Objects::nonNull)
            .findFirst();
}

該方法已在我的Util類中使用多年,使代碼更清晰:

String s = firstNonNull(str1, str2, str3).orElse(str4);

你甚至可以讓它通用:

@SafeVarargs
public static <T> Optional<T> firstNonNull(T... objects) {
    return Arrays.stream(objects)
            .filter(Objects::nonNull)
            .findFirst();
}

// Use
Student student = firstNonNull(student1, student2, student3).orElseGet(Student::new);

我使用了一個輔助函數,比如

T firstNonNull<T>(T v0, T... vs) {
  if(v0 != null)
    return v0;
  for(T x : vs) {
    if (x != null) 
      return x;
  }
  return null;
}

那么這種代碼可以寫成

String s = firstNonNull(str1, str2, str3, str4);

可以應用於任意數量元素的解決方案可以是:

Stream.of(str1, str2, str3, str4)
      .filter(Object::nonNull)
      .findFirst()
      .orElseThrow(IllegalArgumentException::new)

你可以想象一個像下面這樣的解決方案,但第一個確保所有元素的non nullity

Stream.of(str1, str2, str3).....orElse(str4)

您還可以將所有字符串集中到一個字符串數組中,然后執行 for 循環來檢查並在分配后中斷循環。 假設 s1、s2、s3、s4 都是字符串。

String[] arrayOfStrings = {s1, s2, s3};


s = s4;

for (String value : arrayOfStrings) {
    if (value != null) { 
        s = value;
        break;
    }
}

如果沒有分配,則編輯為默認為 s4 的條件。

基於方法且簡單。

String getNonNull(String def, String ...strings) {
    for(int i=0; i<strings.length; i++)
        if(strings[i] != null)
             return s[i];
    return def;
}

並將其用作:

String s = getNonNull(str4, str1, str2, str3);

使用數組很簡單,而且看起來很漂亮。

如果你使用 Apache Commons Lang 3 那么它可以這樣寫:

String s = ObjectUtils.firstNonNull(str1, str2, str3, str4);

使用ObjectUtils.firstNonNull(T...)取自這個答案 相關問題也提出了不同的方法。

使用for 循環將是最合適的解決方案,因為所有初學者和有經驗的開發人員都對循環有足夠的了解。 很簡單,先做一個數組,然后一一檢查條目。 如果找到任何非空字符串,則停止循環,並處理結果。

String[] myData = {s1, s2, s3, s4};
String s = null;

for (String temp : myData) {
    if (temp != null) { 
        s = temp;
        break;
    }
}

現在您可以使用以下代碼跟蹤字符串的 nonNull 值,或者可以檢查所有字符串是否為空。

if(s != null)
    System.out.println(s);
else
    System.out.println("All Strings are null");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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