如何检查多个对象的无效?

Krz*_*lny 43 java null nullable

通常,我可以看到如下代码构造:

if(a == null || b == null || c == null){
    //...
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否有任何广泛使用的库(谷歌,阿帕奇等)同时检查多个对象的无效,例如:

if(anyIsNull(a, b, c)){
    //...
}
Run Code Online (Sandbox Code Playgroud)

要么

if(allAreNulls(a, b, c)){
    //...
}
Run Code Online (Sandbox Code Playgroud)

更新:

  1. 我完全知道如何自己写
  2. 我知道这可能是程序结构不佳的结果,但这不是一个案例
  3. 让它更具挑战性,并用以下内容替换原始示例:

    if(a != null && a.getFoo() != null && a.getFoo().getBar() != null){
        //...
    }
    
    Run Code Online (Sandbox Code Playgroud)

更新2:

我已经为Apache Commons Lang库创建了一个pull请求来修复这个差距:

这些将被纳入commons-lang,版本3.5:

  • anyNotNull (Object... values)
  • allNotNull (Object... values)

tob*_*s_k 39

在Java 8中,您可以使用Stream.allMatch检查所有值是否与特定条件匹配,例如null.不短,但可能更容易阅读.

if (Stream.of(a, b, c).allMatch(x -> x == null)) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

并且为了anyMatchnoneMatch.


关于你的"更具挑战性的例子":在这种情况下,我认为没有办法编写懒惰评估的空检查结合,就像你拥有的那样:

if (a != null && a.getFoo() != null && a.getFoo().getBar() != null) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

任何其他方法,使用流,列表或VAR-ARG方法,将试图评估a.getFoo()之前a已经过测试,不被null.你可以使用Optionalwith map和方法指针,这些指针将被一个接一个地延迟评估,但这是否使它更具可读性是有争议的,可能因情况而异(特别是对于更长的类名):

if (Optional.ofNullable(a).map(A::getFoo).map(B::getBar).isPresent()) {
    ...
}

Bar bar = Optional.ofNullable(a).map(A::getFoo).map(B::getBar).orElse(null);
Run Code Online (Sandbox Code Playgroud)

另一种选择可能是try访问最里面的项目,但我觉得这不是一个好习惯,或者:

try {
    Bar bar = a.getFoo().getBar();
    ...
catch (NullPointerException e) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

特别是,这也将赶上其他NPE的访问该元素-要么,你必须把只有Bar bar = ...try和其他一切在另一个if之后块try,抵消在可读性和简洁的任何(可疑)的收益.

(我依稀记得一些关于符号的东西a?.getFoo()?.getBar() != null,但我不记得它是对Java的特征请求还是一些完全不同的语言.)

  • 哦,这实际上是个好主意.另外,[`Objects :: isNull`](http://docs.oracle.com/javase/8/docs/api/java/util/Objects.html#isNull-java.lang.Object-)可以用作谓词. (8认同)

Pet*_*ček 25

编辑2018年:自Apache Commons lang 3.5以来,已有ObjectUtils.allNotNull()ObjectUtils.anyNotNull().


没有.

的无Apache的百科全书郎(3.4) ,谷歌番石榴(18)弹簧(4.1.7)提供了这样的工具方法.

如果你确实需要它,你需要自己编写它.在现代Java代码中,我可能会考虑需要这样的构造代码味道.

  • @Slantec会考虑这一点,现在有了GitHub和它的拉动请求它很容易:)而且Apache也有GH镜像. (2认同)

kam*_*mwo 12

您还可以使用类似以下方法的内容.它允许您根据需要传递任意数量的参数:

public static boolean isAnyObjectNull(Object... objects) {
    for (Object o: objects) {
        if (o == null) {
            return true;
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

您可以使用任意数量的参数调用它:

isAnyObjectNull(a, b, c, d, e, f);
Run Code Online (Sandbox Code Playgroud)

你可以做类似的事情areAllNull.

public static boolean areAllObjectsNull(Object... objects) {
    for (Object o: objects) {
        if (o != null) {
            return false;
        }
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

注意:您也可以使用三元运算符代替if (o == null).此处显示的两种方法没有错误处理.根据您的需要进行调整.

  • 对于`areAllNull`,如果`o!= null`则返回`false`? (2认同)

via*_*vad 5

Objects.requireNonNull

Objects在类及其方法的帮助下这是可能的requireNonNull

public static void requireNonNull(Object... objects) {
    for (Object object : objects) {
        Objects.requireNonNull(object);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • `requireNonNull` 抛出异常。当 null 不是特殊情况时,它更适合执行合同,而不是测试可空性。 (2认同)