Разработчик должен использовать Optional::of в том месте, где animal по его мнению никогда не должен быть null. Т.е. если бы мы рассматривали данное место на Java 7, то это выглядело бы вот так:
Objects.requireNonNull(animal).
Т.е. я пытаюсь сказать, что если использовать Optional.ofNullable следующим образом:
Optional.ofNullable(animal).ifPresent(dao::saveToStorage)
, то в результате мы лишь получим неправильный дизайн, т.к. последствия такого использования могут вылиться в человеко-дни на поиск этого места в коде, когда окажется что все последующие вызовы отработали успешно, но почему то всё работает не так как ожидалось.
Точно "средний" уровень сложности статьи?
Закопали, потому что обещали Simple, а получилось наоборот.
Objects.requireNonNull(animal).
Т.е. я пытаюсь сказать, что если использовать Optional.ofNullable следующим образом:
Optional.ofNullable(animal).ifPresent(dao::saveToStorage)
, то в результате мы лишь получим неправильный дизайн, т.к. последствия такого использования могут вылиться в человеко-дни на поиск этого места в коде, когда окажется что все последующие вызовы отработали успешно, но почему то всё работает не так как ожидалось.
Потому что концепция Optional — это больше, чем просто проверки на null. Optional призван заменить большие или надоевшие конструкции из if(){}
Пример 1:
Без Optional:
Animal animal = ...;
if(animal instanceof Dog){
Dog dog = (Dog)animal;
this.processDog(dog);
}
С Optional:
Animal animal =…;
Optional.of(animal)
.filter(Dog.class::isInstance)
.map(Dog.class::cast)
.ifPresent(this::processDog);
Пример 2:
Без Optional:
Animal animal =…;
Address address = null;
if(animal.getAge() > 20) {
address = this.getAnimalHomeAddress(animal);
if(!this.isRussiaAddress(address)){
address = new Address();
}
}
С Optional:
Animal animal =…;
Address address = Optional.of(animal)
.filter(a -> a.getAge() > 20)
.map(this::getAnimalHomeAddress)
.filter(this::isRussiaAddress)
.orElseGet(() -> new Address());