如何避免在方法链接中检查空值?

2022-08-31 19:47:08

我需要检查某些值是否为空。如果它不是空的,那么只需将一些变量设置为true。这里没有其他声明。我得到了太多这样的条件检查。

有没有办法在不检查所有方法返回值的情况下处理此空检查?

if(country != null && country.getCity() != null && country.getCity().getSchool() != null && country.getCity().getSchool().getStudent() != null .....) {
    isValid = true;
}

我想过直接检查变量并忽略.这是一种很好的做法吗?NullpointerException

try{
    if(country.getCity().getSchool().getStudent().getInfo().... != null)
} catch(NullPointerException ex){
    //dont do anything.
}

答案 1

不,在 Java 中,捕获 NPE 而不是空值检查引用通常不是一个好的做法。

如果您愿意,可以使用“可选”进行此类操作:

if (Optional.ofNullable(country)
            .map(Country::getCity)
            .map(City::getSchool)
            .map(School::getStudent)
            .isPresent()) {
    isValid = true;
}

或简称

boolean isValid = Optional.ofNullable(country)
                          .map(Country::getCity)
                          .map(City::getSchool)
                          .map(School::getStudent)
                          .isPresent();

如果这就是应该检查的全部内容。isValid


答案 2

您可以在此处使用,但它在每个步骤中创建一个 Optional 对象。Optional

boolean isValid = Optional.ofNullable(country)
    .map(country -> country.getCity()) //Or use method reference Country::getCity
    .map(city -> city.getSchool())
    .map(school -> school.getStudent())
    .map(student -> true)
    .orElse(false);

//OR
boolean isValid = Optional.ofNullable(country)
                      .map(..)
                      ....
                      .isPresent();