当前位置: 首页 > 知识库问答 >
问题:

如何检查多个对象的空值?

赖渊
2023-03-14

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

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

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

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

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

更新:

>

  • 我完全知道怎么自己写
  • 我知道这可能是程序结构不佳的结果,但在这里不是个案
  • 让我们使它更具挑战性,并用这样的内容替换原始示例:

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

    更新2:

    我已经为Apache Commons Lang库创建了一个pull请求,以修复这个漏洞:

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

    这些将纳入Commons-lang 3.5版:

    • anyNotNull(对象…值)
  • 共有3个答案

    吉鸿宝
    2023-03-14
    匿名用户

    你也可以使用下面的方法。它允许您传递任意多个参数

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

    您可以使用任意多个参数来调用它:

    isAnyObjectNull(a, b, c, d, e, f);
    

    您可以为areAllNull执行类似的操作。

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

    注意:如果(o==null),也可以使用三元运算符代替。这里显示的两种方法没有错误处理。根据你的需要调整它。

    王曜文
    2023-03-14

    编辑2018:从Apache Commons lang 3.5开始,有ObjectUtils.allNotNull()ObjectUtils.anyNotNull()

    不。

    Apache Commons Lang(3.4)、Google Guava(18)和Spring(4.1.7)都没有提供这种实用方法

    如果你真的,真的需要的话,你需要自己写。不过,在现代Java代码中,我可能会认为这种构造的必要性是一种代码气味。

    符国安
    2023-03-14

    在Java8中,可以使用流。allMatch检查所有值是否都符合特定条件,例如null。没短多少,但可能更容易阅读。

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

    anyMatchnoneMatch类似。

    关于您的“更具挑战性的示例”:在这种情况下,我认为没有办法编写空检查的惰性求值连接,比如您的:

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

    使用streams、List或var arg方法的任何其他方法都会在测试a是否为null之前尝试评估a.getFoo()。您可以将可选的映射和方法指针一起使用,这些指针将一个接一个地进行惰性评估,但这是否会使其更具可读性仍有争议,并且可能因情况而异(尤其是对于较长的类名):

    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= try中的code>,以及在try之后的另一个if块中的所有其他内容,使任何(有问题的)可读性或简洁性增益无效。

    有些语言有安全导航运算符,但似乎Java不是其中之一。这样,您可以使用a?. getFoo()?. getBar() ! = null这样的符号,其中a?. getFoo()将仅计算为null如果anull。不过,您可以使用自定义函数和lambda来模拟这样的行为,如果您愿意,则返回可选或仅返回一个值或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(););
    

     类似资料:
    • 本文向大家介绍如何检查一个对象是否为空,包括了如何检查一个对象是否为空的使用技巧和注意事项,需要的朋友参考一下 检查一个数组为空很容易,直接调用 length 方法即可,那么如何检查一个对象是否为空呢 ❓ 这里的空指的是对象没有自有属性 假设这里有两个对象,一个是 obj 一个是 anotherObj 想了半天查看对象是否有 Symbol 属性只能使用 getOwnPropertySymbols

    • 超文本传输协议GET方法的响应如下所示: 在前端,我想检查属性是否为空。我尝试过这种方法,但不起作用

    • 我有下面的代码,这是有点难看的多个空检查。 所以我尝试使用,如下所示,但是如果有人阅读我的代码,仍然很难理解。 在Java9中,我们可以使用和,但是在Java8中还有其他方法吗?

    • 问题内容: 我定义一个结构… 有时我给它分配一个空的会话(因为nil不可能) 然后,我想检查一下是否为空: 显然这是行不通的。我该怎么写? 问题答案: 您可以使用==与零值复合文字进行比较,因为所有字段都是可比较的: 游乐场的例子 由于存在歧义,因此在if条件下,在组合文字周围需要括号。 上面的用法适用于所有字段都是可比较的结构。如果该结构包含不可比较的字段(切片,映射或函数),则必须将这些字段一

    • 问题内容: 我正在使用PHP读取JSON数据,并且该数据包含空对象(如)。所以问题是,我必须以不同的方式处理对象为空但无法找到足够好的方法进行检查的情况。看起来太吓人了,效率很低。有没有好的检查方法? 问题答案: 您要反序列化多少个对象?除非事实证明或强制转换是主要的放慢速度/瓶颈,否则我不会担心– Greg的解决方案就可以了。 不过,我建议在解码JSON数据时使用标志: 这会将JSON对象解码为

    • 我使用下面的代码使用model访问我的数据库。 我用下面的代码检查了$人是否为空。 实际上是空的。但我得到的结果为作为