NULL проверка объектов в JAVA 8 - PullRequest
       70

NULL проверка объектов в JAVA 8

0 голосов
/ 07 сентября 2018

Итак, я хочу сделать нулевую безопасную проверку значения, содержащегося в значении.

Итак, у меня есть 3 объекта, заключенных друг в друга:

У человека есть предмет одежды, в котором есть объект страны, в котором есть заглавная буква

Так что у человека может не быть одежды, поэтому проверка, подобная этой, бросает нулевой указатель:

if (person.getClothes.getCountry.getCapital)

Как бы я мог сделать такое утверждение, просто вернуть false, если какой-либо из объектов на пути имеет значение null?

Я тоже не хочу делать это таким образом. (Однострочник в Java-8, если это возможно.

if (person !=null) {
    if (person.getClothes != null) {
        if (person.getClothes.getCountry !=null) {
            etc....
        }
    }
}

Ответы [ 4 ]

0 голосов
/ 07 сентября 2018

Эти «каскадные» нуль-проверки - действительно параноидальное и оборонительное программирование. Я бы начал с вопроса, не лучше ли сделать так, чтобы он быстро провалился или проверил ввод непосредственно перед тем, как он сохранится в такой структуре данных?

Теперь к вопросу. Так как вы использовали вложенную нулевую проверку, вы можете сделать то же самое с Optional<T> и методом Optional::map, который позволяет получить лучший контроль:

Optional.ofNullable(person.getClothes())
        .map(clothes -> clothes.getCountry())
        .map(country -> country.getCapital())
        .orElse(..)                               // or throw an exception.. or use ifPresent(...)
0 голосов
/ 07 сентября 2018

Как вы упомянули Java -8 Вот что вы хотели бы

Objects.isNull(person) //returns true if the object is null

Objects.nonNull(person) //returns true if object is not-null

Optional.ofNullable(person.getClothes())
    .flatMap(Clothes::getCountry)
    .flatMap(Country::getCapital)
    .ifPresent(...)

Используя Optional и никогда не работая с нулем, вы могли бы вообще избежать нулевых проверок. Так как они не нужны, вы также избегаете пропуска нулевой проверки, ведущей к NPE. Тем не менее, убедитесь, что значения, возвращаемые из унаследованного кода (Map, ...), который может быть нулевым, обернуты как можно скорее в Optional. проверьте здесь

if(Objects.nonNull(person) && Objects.nonNull(person.getClothes) &&  Objects.nonNull(person.getClothes.getCountry )){
   // do what ever u want
 }

А если вы работаете с Collections и используете org.apache.commons тогда CollectionUtils.isNotEmpty(persons) и CollectionUtils.isEmpty(persons) будут работать для вас. Где Persons означает List человека.

0 голосов
/ 07 сентября 2018

Вы можете достичь, используя одну строку кода

if (person != null && person.getClothes != null && person.getClothes.getCountry != null) { }

Как вы знаете, существует существенная разница между = и ==.

Операторы && и || являются короткими замыканиями, то есть они не будут оценивать свое правое выражение, если значение левого выражения достаточно для определения результата

Если ваше первое выражение верно, то только оно будет проверять следующее выражение.

Если первое выражение ложно, оно не будет проверять следующее выражение.

Так как ваше требование, если человек не нулевой, тогда проверьте только на person.getClothes != null и т. Д.

0 голосов
/ 07 сентября 2018

Вы можете связать все эти вызовы через Optional::map. Мне кажется, что это легче читать, чем if/else, но это может быть только я

Optional.ofNullable(person.getClothes())
        .map(Clothes::getCountry)
        .map(Country::getCapital)
        .ifPresent(...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...