Quand j'ai besoin d'utiliser en Option.orElseGet() cours Facultatif.orElse()
J'ai besoin d'explication claire sur ce point, même si je l'ai lu ce lien sur les différences, mais pas de clarté. Si quelqu'un m'expliquer sur ce bref avec code.
- Ce n'est pas clair dans la accepté de répondre?
- J'ai pas idée claire de la réponse
- Généralement, vous pouvez utiliser l'un ou l'autre comme vous le souhaitez.
- Si la production de la valeur de retour dans le “orElse” cas nécessite quelques calculs, mon goût serait probablement pour
orElseGet()
de sorte que le calcul est effectué uniquement en cas de besoin. Si le calcul a des effets secondaires, vous devez choisir si vous voulez que ces effets secondaires toujours ou uniquement lorsque l'objet est nécessaire. orElse()
serait le choix naturel dans la plupart des situations. Dans notre base de code que nous utilisonsorElse()
31 fois etorElseGet()
0 fois à tous.- J'ai fait la même chose tout à l'heure 🙂 l'un de l'utilisation de
orElseGet
- le retour de l'objet provient d'une base de données d'appel. - C'est certainement justifié! @Eugene Merci pour cette stats.
- Connexes: Différence entre
Optional.orElse()
etOptional.orElseGet()
Vous devez vous connecter pour publier un commentaire.
Je pense que je commence à comprendre votre question. L'ordre d'exécution avec
Optional
peut être différent de ce que nous sommes habitués à la programmation procédurale (la même chose est vraie pour Java cours d'eau et autres code à l'aide de lambda).Je vais utiliser les deux exemples de Eugène réponse:
C'est plain old Java: c'est un appel à
orElse()
prendrenew MyObject()
comme argument. Donc, l'argument est évalué en premier, et une nouvelleMyObject
créé. Il est ensuite passé àorElse()
.orElse()
attend de voir si une valeur est présente dans laOptional
; si on en revient donc que la valeur (en enlevant l'objet nouvellement créé); dans le cas contraire, il renvoie l'objet donné en argument. C'était l'exemple plus simple.Encore, nous avons un appel de méthode avec un argument, et encore, l'argument est évalué en premier. Le lambda est créé et transmis en tant que fournisseur. Le code à l'intérieur
{ }
n'est pas exécuté (vous voyez aussi pasShould I see this
à Eugene de sortie). NouveauorElseGet
regarde pour voir si il ya une valeur dans laOptional
. Si il y a, la valeur est retournée et le fournisseur nous avons passé le reste est ignoré. Si il n'y en a pas, le fournisseur est invoquée, le code à l'intérieur{ }
est exécutée pour obtenir la valeur à renvoyer à partir deorElseGet()
.Dans le premier cas, on peut dire que l'un
MyObject
est créé et est gaspillée. Dans la seconde uneSupplier
est créé et est gaspillée. Ce que vous obtenez en retour est laconique et de pointeur null coffre-fort à code dans les deux cas. Donc, très souvent, il n'est pas important que celui que vous choisissez. Si la création de laMyObject
est coûteux ou a des effets secondaires non désirés, vous souhaitez que la deuxième version où l'objet n'est créé que lorsque c'est demandé, et n'est jamais perdu. Eugene, dans un commentaire mentionne le cas où le retour de l'objet provient d'une base de données d'appel. Appels de base de données sont généralement assez fastidieux que vous ne voulez pas en faire un pour aucun but.orElse()
sera de retour"po"
.Optional
(en invoquant sontoString()
), pas la chaîne de retour deorElse()
.Un exemple:
Et certaines d'utilisation:
Et certains de sortie:
En cas
Optional
a une valeur;orElse
est encore appelé, mais pas utilisé. Sur le contradictoireorElseGet
n'est pas appelé.Considérer le cas lors de la création de l'objet est cher, celui que vous allez utiliser?
Il est effectivement plus facile à comprendre je pense que si vous regardez dans le code:
finally
danstry-catch
expression?finally
est toujours appelé. Aussi combien de fois avez-vous écritnew HashMap<>()
par exemple pour ajouter seulement deux entrées, par exemple - plus d'espace est réservé, mais vous ne l'utilisez pas. Et plus probablementorElse(new ArrayList<>())
serait moins cher que d'appeler unSupplier
qui produit une.orElse()
est toujours appelé, peu importe si l'objet à qui appartientorElse()
estnull
ou pasnull
.orElse
est toujours appelé; vous ne savez pas si c'est une mauvaise API décision si. Il est parfois moins cher de créer un Objet et de ne pas l'utiliser, de reporter à une méthode qui pourrait la créer et je pense vraiment que c'est le cas ici.Comme réponse à ici, vous pourriez envisager de la deuxième approche lors de la ressource requise est coûteux d'obtenir.