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();