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

cod*_*Man 23 java conditional if-statement

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

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

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;
}
Run Code Online (Sandbox Code Playgroud)

我知道这可以一次完成if()if为了可读性,我在这里添加了多个。

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

ern*_*t_k 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);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您确实喜欢方法参考,则使用Boolean.FALSE :: equals而不是source->!source。 (9认同)
  • @ user11153该参数需要一个布尔值..您给它一个布尔值,因此必须将其装箱。这不是少拆箱,而是多拆箱 (3认同)
  • 我认为你的意思是Optional.ofNullable() (2认同)

Kha*_*hah 15

如果其中任何一个为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();

}
Run Code Online (Sandbox Code Playgroud)

更新 :

如果您希望每个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;

 }
Run Code Online (Sandbox Code Playgroud)

  • C#的空条件运算符(?。)是为了确保一切顺利... (5认同)
  • 通常,它们*应该*没有副作用,但是假设您正在与由知道他们在做什么并且遵循良好软件工程原则和Java最佳实践的人编写的类一起工作。在现实世界中,这是一个非常勇敢的假设。 (5认同)
  • 我发现该模式的一个问题是它执行4次getApplication,3次getMetadata和2次getSource。如果它们都是微不足道的吸气剂,那么这可能不是什么大问题。但是,如果它们的实现不是很简单的(甚至更糟:不是没有副作用的),那么这可能会成为问题。 (3认同)