Java 8中的多个空检查

时间:2019-02-21 06:45:53

标签: java 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中还有其他方法吗?

10 个答案:

答案 0 :(得分:162)

您可以这样做:

<div class="section">
  <div class="container">
    <h1>Hello world</h1>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
    <p>Donec lacinia ante id nisi ultricies dictum.</p>
    <h1>Hello again</h1>
    <p>Proin rutrum mollis lorem ac hendrerit.</p>
    <p>Nunc laoreet odio non rhoncus sodales.</p>
  </div>
</div>

答案 1 :(得分:73)

三元条件运算符如何?

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

答案 2 :(得分:32)

您还可以使用循环:

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

答案 3 :(得分:26)

当前答案很好,但您确实应该将其放在实用程序方法中

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

答案 4 :(得分:13)

我使用辅助功能,例如

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

答案 5 :(得分:4)

可以应用于任意数量的元素的解决方案可以是:

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

您可以想象下面的解决方案,但是第一个解决方案确保所有元素non nullity

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

答案 6 :(得分:3)

您还可以将所有String汇总到String数组中,然后执行for循环以检查并在分配循环后退出循环。 假设s1,s2,s3,s4都是字符串。

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


s = s4;

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

编辑后,如果未分配任何条件,则默认为s4。

答案 7 :(得分:2)

基于方法且简单。

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

使用数组很简单,而且看起来很漂亮。

答案 8 :(得分:0)

如果您使用Apache Commons Lang 3,则可以这样编写:

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

ObjectUtils.firstNonNull(T...)的使用answer。相关的question中也提出了不同的方法。

答案 9 :(得分:0)

使用 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");