gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:42:30 26 4
gpt4 key购买 nike

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

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 库创建了一个拉取请求来解决这个问题:

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

  • anyNotNull(对象...值)
  • allNotNull(对象...值)

最佳答案

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

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

对于 anyMatch 也是如此和 noneMatch .


关于您的“更具挑战性的示例”:在这种情况下,我认为没有办法编写空检查的惰性求值连词,就像您所拥有的那样:

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 之后的 block ,使可读性或简洁性方面的任何(有问题的) yield 无效。


有些语言有 Safe Navigation Operator ,但似乎 Java 不是其中之一。这样,您可以使用像 a?.getFoo()?.getBar() != null 这样的符号。 , 其中 a?.getFoo()将评估为 null如果 anull .您可以使用自定义函数和 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(););

关于java - 如何检查多个对象的无效性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31582524/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com