有没有更好的方法在Java中执行空检查?

时间:2019-04-11 10:42:36

标签: java if-statement conditional

这看起来像是一个原始问题,或者可以通过我不知道的简单实用程序库方法来完成。

目标是检查嵌套在两个对象下的布尔字段的值。

private boolean sourceWebsite(Registration registration) {
    Application application = registration.getApplication();
    if (application == null) {
        return true;
    }

    Metadata metadata = application.getMetadata();
    if (metadata == null) {
        return true;
    }

    Boolean source = metadata.getSource();
    if (source == null) {
        return true;
    }

    return !source;
}

我知道这可以在单个if()中完成。为了便于阅读,我在这里添加了多个if

有没有一种方法可以简化上面的if语句,并有一个简单的实用工具类,如果父对象为null或不为null,则该类返回Boolean source的值?

4 个答案:

答案 0 :(得分:38)

您可以通过以下方式使用java.util.Optional

private boolean sourceWebsite(Registration registration) {
    return Optional.of(registration)
        .map(Registration::getApplication)
        .map(Application::getMetadata)
        .map(Metadata::getSource)
        .map(source -> !source)
        .orElse(Boolean.TRUE);
}

简而言之,如果任何getter返回null,则返回true,否则返回!Metadata.source

答案 1 :(得分:15)

如果其中任何一个为null,则以下内容将返回true。如果所有值都不为空,则返回!source

private boolean sourceWebsite(Registration registration) {
      return registration.getApplication() == null 
      ||     registration.getApplication().getMetadata() == null
      ||     registration.getApplication().getMetadata().getSource() == null
      ||    !registration.getApplication().getMetadata().getSource();

}

已更新:

如果您希望每个getter不被多次调用,则可以为每个对象声明变量

private boolean sourceWebsite(Registration registration) {
      Application application;
      Metadata metadata;
      Boolean source;
      return (application = registration.getApplication()) == null 
      ||     (metadata = application.getMetadata()) == null
      ||     (source = metadata.getSource()) == null
      ||    !source;

 }

答案 2 :(得分:2)

您可以使用的另一个选项是try-catch块。如果出现空指针异常,则返回true。

private boolean sourceWebsite(Registration registration) {
    try {
        return !registration.getApplication().getMetadata().getSource();
    }
    catch (NullPointerException e) {
        return true;
    }
}

答案 3 :(得分:-2)

您可以使用类似下面的方法:

public static Object get(Object o, String... m) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
    if (o == null || m.length == 0) {
        return null;
    }
    for (String m1 : m) {
        o = o.getClass().getMethod(m1).invoke(o);
        if (o == null) {
            return null;
        }
    }
    return o;
}

并这样称呼它:

Boolean source = (Boolean) get(registration, "getApplication", "getMetadata", "getSource");
return source == null ? false : !source;

但是在任何严肃的项目中我都不会这样做。