Vérifiez tout d'abord la déclaration des deux méthodes.
1) OrElse: exécuter la logique et passer le résultat en argument.
public T orElse(T other) {
return value != null ? value : other;
}
2) OrElseGet: Exécute la logique si la valeur à l'intérieur de l'option est nulle
public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}
Quelques explications sur la déclaration ci-dessus:
L'argument de "Optional.orElse" est toujours exécuté quelle que soit la valeur de l'objet en option (null, vide ou avec valeur). Tenez toujours compte du point mentionné ci-dessus lorsque vous utilisez «Optional.orElse», sinon l'utilisation de «Optional.orElse» peut être très risquée dans la situation suivante.
Risque-1) Problème de journalisation: si le contenu dans orElse contient une instruction de journal: dans ce cas, vous finirez par le journaliser à chaque fois.
Optional.of(getModel())
.map(x -> {
//some logic
})
.orElse(getDefaultAndLogError());
getDefaultAndLogError() {
log.error("No Data found, Returning default");
return defaultValue;
}
Risque-2) Problème de performances: si le contenu dans orElse est chronophage : le contenu chronophage peut être n'importe quel appel de base de données d'opérations d'E / S, appel d'API, lecture de fichier. Si nous mettons un tel contenu dans orElse (), le système finira par exécuter un code inutile.
Optional.of(getModel())
.map(x -> //some logic)
.orElse(getDefaultFromDb());
getDefaultFromDb() {
return dataBaseServe.getDefaultValue(); //api call, db call.
}
Risque-3) Problème d'état ou de bogue illégal: Si le contenu dans orElse mute un état d'objet: nous pourrions utiliser le même objet à un autre endroit, disons à l'intérieur de la fonction Optional.map et cela peut nous mettre dans un bogue critique.
List<Model> list = new ArrayList<>();
Optional.of(getModel())
.map(x -> {
})
.orElse(get(list));
get(List < String > list) {
log.error("No Data found, Returning default");
list.add(defaultValue);
return defaultValue;
}
Alors, quand peut-on aller avec orElse ()?
Préférez utiliser orElse lorsque la valeur par défaut est un objet constant, enum. Dans tous les cas ci-dessus, nous pouvons utiliser Optional.orElseGet () (qui ne s'exécute que lorsque Optional contient une valeur non vide) au lieu de Optional.orElse (). Pourquoi?? Dans orElse, nous transmettons la valeur de résultat par défaut, mais dans orElseGet, nous transmettons Supplier et la méthode de Supplier ne s'exécute que si la valeur dans Optional est nulle.
Points clés à retenir de ceci:
- N'utilisez pas «Optional.orElse» s'il contient une instruction de journal.
- N'utilisez pas «Optional.orElse» s'il contient une logique chronophage.
- N'utilisez pas «Optional.orElse» s'il mute un état d'objet.
- Utilisez «Optional.orElse» si nous devons renvoyer une constante, enum.
- Préférez «Optional.orElseGet» dans les situations mentionnées aux points 1,2 et 3.
Je l'ai expliqué au point-2 ( "Optional.map/Optional.orElse"! = "If / else" ) mon blog moyen. Utiliser Java8 comme programmeur et non comme codeur
orElseGet
il n'appelle le fournisseur que si la valeur est absente.