2017-04-19 1 views
1

Pourquoi orElse est-il exécuté à chaque fois, même si ce n'est pas le cas? Qu'est-ce que je fais mal ici? J'apprends encore java :)init objet en ligne et passe en paramètre - java

Optional.ofNullable(myVar) 
      .orElse(Optional.ofNullable(myVar = ...))) 
       .orElseThrow(MyException::new)) 

Répondre

4

Utilisez orElseGet(). Il accepte un Supplier et il sera appelé seulement si nécessaire. Par exemple.

Optional.ofNullable(myVar) 
     .orElseGet(() -> Optional.ofNullable(myVar = ...))) 
      .orElseThrow(MyException::new)) 

Pour clarifier: l'argument que vous fournissez orElse() est évaluée, mais orElse() est lui-même pas appelé. C'est un effet secondaire dans votre cas, et vous devriez utiliser orElseGet() si vous voulez retarder son exécution à quand elle est nécessaire.

+0

Expliquez-moi d'abord pourquoi whyyy ??? – Ckkn

+0

Pourquoi est-ce un effet secondaire? un bug dans le compilateur ou quoi? expliquez-moi svp je veux savoir pourquoi être capable d'éviter ces effets secondaires dans la programmation ultérieure – Ckkn

+1

Java évalue les arguments de méthode avant d'appeler lesdites méthodes. Dans votre cas, vous fournissez un argument à 'orElse()' et java évalue heureusement cela pour préparer l'invocation de la méthode. Donc, même si 'orElse()' n'est pas appelé, votre argument que vous passez à 'orElse()' sera évalué. – Justas

1

xplain moi pls premier whyyy ??? - CKKN

La méthode orElse() attend un objet qui doit être créé avant l'appel de la méthode est exécutée. Cet objet (déjà existant) est renvoyé si le contenu Nullable est réellement null.

La méthode orElseGet() attend également un objet existant, mais cet objet n'est pas renvoyé lui-même. L'objet attendu est de type Supplier qui a une seule méthode à appeler lorsque le contenu Nullable est réellement null. De cette façon, vous pouvez éviter de créer votre objet valeur chaque fois que le orElseGet() est appelé. Mais vous "achetez" ceci en créant un objet Supplier à la place. D'autre part, l'objet Supplier pourrait facilement être un membre d'instance ou une constante ...

+0

aaahh putain, je l'ai, merci – Ckkn