Java 8 中的多个空检查
Multiple null checks in Java 8
我有下面的代码,对于多个 null 检查来说有点难看。
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)));
在Java9中,我们可以使用Optional.ofNullable
和OR
,但是在Java8中还有其他方法吗?
三元条件运算符怎么样?
String s =
str1 != null ? str1 :
str2 != null ? str2 :
str3 != null ? str3 : str4
;
你可以这样做:
String s = Stream.of(str1, str2, str3)
.filter(Objects::nonNull)
.findFirst()
.orElse(str4);
你也可以使用循环:
String[] strings = {str1, str2, str3, str4};
for(String str : strings) {
s = str;
if(s != null) break;
}
可以应用于任意数量元素的解决方案可以是:
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.
String[] arrayOfStrings = {s1, s2, s3};
s = s4;
for (String value : arrayOfStrings) {
if (value != null) {
s = value;
break;
}
}
编辑为在分配 none 时加入默认为 s4 的条件。
当前的答案很好,但你真的应该把它放在一个实用方法中:
public static Optional<String> firstNonNull(String... strings) {
return Arrays.stream(strings)
.filter(Objects::nonNull)
.findFirst();
}
那个方法已经在我的 Util
class 里用了很多年了,使代码更简洁:
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);
基于方法且简单。
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...)
was taken from this answer. Different approaches were also presented in related question.
使用 for 循环 将是最合适的解决方案,因为所有初学者和有经验的开发人员都对循环有足够的了解。很简单,先做一个数组,然后逐个查表项。如果找到任何非空字符串,则停止循环,并继续处理结果。
String[] myData = {s1, s2, s3, s4};
String s = null;
for (String temp : myData) {
if (temp != null) {
s = temp;
break;
}
}
现在您可以使用以下代码跟踪字符串的非空值,或者检查所有字符串是否为空。
if(s != null)
System.out.println(s);
else
System.out.println("All Strings are null");
我有下面的代码,对于多个 null 检查来说有点难看。
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)));
在Java9中,我们可以使用Optional.ofNullable
和OR
,但是在Java8中还有其他方法吗?
三元条件运算符怎么样?
String s =
str1 != null ? str1 :
str2 != null ? str2 :
str3 != null ? str3 : str4
;
你可以这样做:
String s = Stream.of(str1, str2, str3)
.filter(Objects::nonNull)
.findFirst()
.orElse(str4);
你也可以使用循环:
String[] strings = {str1, str2, str3, str4};
for(String str : strings) {
s = str;
if(s != null) break;
}
可以应用于任意数量元素的解决方案可以是:
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.
String[] arrayOfStrings = {s1, s2, s3};
s = s4;
for (String value : arrayOfStrings) {
if (value != null) {
s = value;
break;
}
}
编辑为在分配 none 时加入默认为 s4 的条件。
当前的答案很好,但你真的应该把它放在一个实用方法中:
public static Optional<String> firstNonNull(String... strings) {
return Arrays.stream(strings)
.filter(Objects::nonNull)
.findFirst();
}
那个方法已经在我的 Util
class 里用了很多年了,使代码更简洁:
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);
基于方法且简单。
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...)
was taken from this answer. Different approaches were also presented in related question.
使用 for 循环 将是最合适的解决方案,因为所有初学者和有经验的开发人员都对循环有足够的了解。很简单,先做一个数组,然后逐个查表项。如果找到任何非空字符串,则停止循环,并继续处理结果。
String[] myData = {s1, s2, s3, s4};
String s = null;
for (String temp : myData) {
if (temp != null) {
s = temp;
break;
}
}
现在您可以使用以下代码跟踪字符串的非空值,或者检查所有字符串是否为空。
if(s != null)
System.out.println(s);
else
System.out.println("All Strings are null");