如何检查多个对象是否无效?

新手上路,请多包涵

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

 if(a == null || b == null || c == null){
    //...
}

我想知道是否有任何广泛使用的库(Google、Apache 等)可以同时检查多个对象的无效性,例如:

 if(anyIsNull(a, b, c)){
    //...
}

或者

if(allAreNulls(a, b, c)){
    //...
}

更新:

  1. 我完全知道如何自己写
  2. 我知道这可能是程序结构不佳的结果,但这里不是这种情况
  3. 让我们让它更具挑战性,并用这样的东西替换原来的例子:
    if(a != null && a.getFoo() != null && a.getFoo().getBar() != null){
       //...
   }

更新 2:

我为 Apache Commons Lang 库创建了一个 pull request 来解决这个问题:

  • 问题: https ://issues.apache.org/jira/browse/LANG-781
  • 公关: https ://github.com/apache/commons-lang/pull/108

这些将合并到 commons-lang 版本 3.5 中:

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

原文由 Krzysztof Wolny 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 398
2 个回答

在 Java 8 中,您可以使用 Stream.allMatch 检查所有值是否都符合特定条件,例如 null 。不会短很多,但可能更容易阅读。

 if (Stream.of(a, b, c).allMatch(x -> x == null)) {
    ...
}

anyMatchnoneMatch


关于您的“更具挑战性的示例”:在这种情况下,我认为没有办法编写一个惰性评估的空检查结合,就像您拥有的那样:

 if (a != null && a.getFoo() != null && a.getFoo().getBar() != null) {
    ...
}

任何其他方法,使用流、列表或 var-arg 方法,将尝试评估 a.getFoo()a 被测试为不是 null 您可以将 Optionalmap 和方法指针一起使用,它们将一个接一个地进行惰性求值,但这是否使它更具可读性是值得商榷的,并且可能因情况而异(特别是对于较长的类名):

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

Bar bar = Optional.ofNullable(a).map(A::getFoo).map(B::getBar).orElse(null);

另一种选择可能是 try 访问最里面的项目,但我觉得这也不是好的做法:

 try {
    Bar bar = a.getFoo().getBar();
    ...
catch (NullPointerException e) {
    ...
}

特别是,这还将在访问该元素 捕获任何其他 NPE——或者你只需 Bar bar = ... 放入 try 并将其他所有内容放入另一个 if 块在 try 之后,抵消了可读性或简洁性方面的任何(有问题的)收益。


有些语言有 Safe Navigation Operator ,但 Java 似乎不是其中之一。 This way, you could use a notation like a?.getFoo()?.getBar() != null , where a?.getFoo() will just evaluate to null if a is null 。您可以使用自定义函数和 lambda 模拟这样的行为,不过,如果您愿意,返回 Optional 或者只是一个值或 null :—

 public static <T> Optional<T> tryGet(Supplier<T> f) {
    try {
        return Optional.of(f.get());
    } catch (NullPointerException e) {
        return Optional.empty();
    }
}

Optional<Bar> bar = tryGet(() -> a.getFoo().getBar(););

原文由 tobias_k 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题