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

2022-09-01 21:58:21

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

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

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;
}

我知道这可以在一个单一的.为了便于阅读,我在这里添加了多个s。if()if

有没有办法简化上面的语句,并有一个简单的实用程序类,返回父对象是否为null的值?ifBoolean source


答案 1

你可以用这种方式使用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


答案 2

如果 其中任何一个为 null,则以下将返回 true。如果所有值都不为 null,则返回 。!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;

 }

推荐