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?
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
.
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;
});
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();