web-dev-qa-db-fra.com

Java Facultatif - Si autres instructions

Après quelques lectures, j'ai vu que 

if (optional.isPresent()) {
    //do smth
}

n’est pas le moyen préféré d’utiliser Facultatif ( http://www.Oracle.com/technetwork/articles/Java/java8-optional-2175753.html ). Mais si j'ai un if-statement comme ceci:

if (optional.isPresent()) {
    car = getCar(optional.get());
} else {
    car = new Car();
    car.setName(carName);
}

Est-ce la meilleure façon de procéder ou existe-t-il une méthode plus recommandée?

10
uraza

Vous pouvez utiliser Optional comme suit.

Car car = optional.map(id -> getCar(id))
            .orElseGet(() -> {
                Car c = new Car();
                c.setName(carName);
                return c;
            });

Ecrire avec if-else est un style impératif et nécessite que la variable car soit déclarée avant le bloc if-else.

Utiliser map dans Optional est un style plus fonctionnel. Et cette approche ne nécessite pas de déclaration de variable à l'avance et constitue un moyen recommandé d'utiliser Optional.

24
TheKojuEffect

Si vous pouvez incorporer le nom dans le constructeur Car, vous pouvez écrire ceci:

car = optional.map(id -> getCar(id))
              .orElseGet(() -> new Car(carName));

Si vous devez appeler le séparateur séparément de votre constructeur, vous obtiendrez quelque chose comme ceci:

car = optional.map(id -> getCar(id))
              .orElseGet(() -> {
                  Car c = new Car();
                  c.setName(carName);
                  return c;
              });
5
khelwood

Pour aller plus loin, si vous avez plusieurs if (optional.isPresent()) ou if (obj != null)

Tu peux le faire: 

(getN renvoie Optional<Car>)

return get1().map(Optional::of)
.orElseGet(() -> get2()).map(Optional::of)
.orElseGet(() -> get3()).map(Optional::of);

C'est à dire. serait comme cela en utilisant if déclarations

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