Supposons que j'ai une méthode session.get(str: String): String
mais que vous ne savez pas si elle vous renverra une chaîne ou une valeur nulle, car elle provient de Java.
Existe-t-il un moyen plus simple de traiter cela dans Scala au lieu de session.get("foo") == null
? Peut-être qu'un peu de magie s'applique comme ToOption(session.get("foo"))
et ensuite je peux le traiter à la manière Scala comme
ToOption(session.get("foo")) match {
case Some(_) =>;
case None =>;
}
java
scala
scala-option
José Leal
la source
la source
Réponses:
La méthode de
Option
l'objet compagnonapply
sert de fonction de conversion à partir des références Nullable:la source
L'
Option
objet a uneapply
méthode qui fait exactement cela:la source
Notez que lorsque vous travaillez avec des objets Java, cela ne fonctionnera pas comme prévu:
la source
C'est un sujet très ancien mais intéressant!
Il est vrai que la conversion de tout résultat Non-exception de Try to Option entraînera un Some ...
... parce que Try ne concerne pas la vérification de la nullité, mais simplement un moyen de gérer fonctionnellement les exceptions.
Utiliser Try pour attraper une exception et la convertir en Option pour plus de commodité n'affichera None que si une exception se produit.
Vous souhaitez conserver les valeurs issues de Try. Cela peut être nul.
Mais il est également vrai que la lib standard est parfois assez déroutante ...
Ce comportement est un peu incohérent, mais il reflète en quelque sorte l'utilisation intentionnelle de Try et Option.
Vous utilisez essayer d'obtenir tout ce qui sort d'une expression qui peut lever des exceptions, et vous ne vous souciez pas de l'exception elle-même.
La valeur qui peut sortir peut très bien être une valeur nulle. Si toOption donnait None, vous ne pouviez pas faire la différence entre une exception et une null , et ce n'est pas joli!
Autonome, vous utilisez Option pour encapsuler l'existence ou non de quelque chose. Donc, dans ce cas, Some (null) vaut None, et cela a du sens, car null dans ce cas représente l'absence de quelque chose. Il n'y a pas d'ambiguïté ici.
Il est important de noter que dans tous les cas, la transparence référentielle n'est pas rompue car .toOption n'est pas la même chose que Option ()
Si vous avez vraiment besoin de faire respecter BOTH la sécurité d'exception et la sécurité nulle et votre code vraiment ne pas vraiment besoin de Différencier entre null et une exception , il vous suffit de combiner les deux paradigmes! Parce que bon, c'est ce que tu veux, non?
Vous pouvez le faire d'une manière ...
... ou un autre ...
... ou le plus ridiculement laid d'entre eux et d'autres ...
la source