Java Дополнительно - если Else Statementments
Итак, после некоторого чтения я увидел, что
if (optional.isPresent()) {
//do smth
}
не является предпочтительным способом использования Необязательно (http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html). Но если у меня есть оператор if:
if (optional.isPresent()) {
car = getCar(optional.get());
} else {
car = new Car();
car.setName(carName);
}
Это лучший способ сделать это или есть более рекомендуемый способ?
Ответы
Ответ 1
Вы можете использовать Optional
следующим образом.
Car car = optional.map(id -> getCar(id))
.orElseGet(() -> {
Car c = new Car();
c.setName(carName);
return c;
});
Запись с инструкцией if-else
является обязательным стилем и требует, чтобы переменная car
была объявлена перед блоком if-else
.
Использование map
в Optional
более функциональный. И этот подход не требует объявления переменной заранее, и рекомендуется использовать Optional
.
Ответ 2
Если вы можете включить имя в конструктор Car
, вы можете написать это:
car = optional.map(id -> getCar(id))
.orElseGet(() -> new Car(carName));
Если вы должны вызывать установщик отдельно от своего конструктора, вы получите что-то вроде этого:
car = optional.map(id -> getCar(id))
.orElseGet(() -> {
Car c = new Car();
c.setName(carName);
return c;
});
Ответ 3
Для дальнейшего, если у вас есть несколько if (optional.isPresent())
или if (obj != null)
Вы можете сделать это:
(getN возвращает Optional<Car>
)
return get1().map(Optional::of)
.orElseGet(() -> get2()).map(Optional::of)
.orElseGet(() -> get3()).map(Optional::of);
Т.е. было бы так, используя операторы if
Optional<Car> car = get1();
if (car.isPresent()){
return car;
}
car = get2();
if (car.isPresent()){
return car;
}
car = get3();
if (car.isPresent()){
return car;
}
return Optional.empty();