[英]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.ofNullable
與OR
一起使用,但是在 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.