Convertir l'option [x] en x dans Scala
J'ai travaille avec jouer pour scala (2.1) et j'ai besoin de convertir une "Option[Long]" la valeur de "Long".
Je sais comment faire le contraire, je veux dire:
def toOption[Long](value: Long): Option[Long] = if (value == null) None else Some(value)
Mais dans mon cas, je dois passer une valeur de "l'Option[Long]" comme un type dans une méthode qui prend un "Long".
Toute aide, s'il vous plaît.
source d'informationauteur mahoosh
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, votre mise en œuvre de "l'autre" a des problèmes plus sérieux. En mettant un type de paramètre nommé
Long
sur la méthode de l'ombre à laLong
type de la bibliothèque standard. Tu veux sans doute dire ce qui suit:Même c'est le genre de non-sens (depuis
scala.Long
n'est pas un type de référence et ne peut jamais êtrenull
), sauf si vous faites allusion à l'java.lang.Long
ce qui est une recette pour la douleur et la confusion. Enfin, même si nous avions affaire à un type de référence (commeString
), vous seriez mieux de l'écriture de la suite, qui est exactement équivalente:Cette méthode sera de retour
None
si et seulement sivalue
estnull
.À répondre à votre question, supposons que nous avons la méthode suivante:
Vous ne devriez pas généralement à penser en termes de passage d'un
Option[Long]
àfoo
mais plutôt de "levage"foo
dans leOption
viamap
:Le point de l'ensemble de
Option
est de modèle (au niveau du type) la possibilité d'une valeur "null, afin d'éviter toute une classe deNullPointerException
-y les problèmes. À l'aide demap
sur leOption
vous permet d'effectuer des calculs sur la valeur que peut-être dans leOption
tout en continuant à le modèle de la possibilité qu'elle est vide.Comme une autre réponse, il est également possible d'utiliser
getOrElse
de "renflouer" de laOption
mais ce n'est généralement pas le idiomatiques approche en Scala (sauf dans les cas où il est vraiment raisonnable de la valeur par défaut).Si vous avez des x comme Option[Long],
x.get
vous donnera une Longue.Cette méthode est déjà défini sur l'Option[A] et est appelé obtenir :
Le problème est que l'appel de get sur Aucun allons jeter un NoSucheElement Exception:
donc vous ne pourrez pas bénéficier des avantages de l'utilisation d'une Option de type.
Ainsi, comme indiqué précédemment, vous pouvez utiliser getOrElse si vous pouvez fournir une valeur par défaut raisonnable de la valeur ou de traiter l'Exception.
La idiomatiques scala façon serait d'utiliser une carte ou une compréhension
ou
Option est la façon de le localiser effet de bord de votre fonction peut renvoyer une valeur vide). Et le bon style pour vous remonter le calcul de l'Option (l'Option est Monade avec carte & flatMap méthodes).
Et en extraire la valeur manuellement le traitement d'un effet secondaire:
Vous devez décider ce qui se passe lorsque l'option est
None
. Ne vous fournir une valeur par défaut?Vous pouvez également lancer une exception:
En cas, de s'abstenir de l'utilisation de
null
sauf si vous avez de très bonnes raisons de l'utiliser (opt.orNull
).Comme cela a déjà été mentionné getOrElse est probablement ce que vous cherchez à répondre directement à votre question.
Veuillez noter également que pour le convertir en option, vous pouvez tout simplement:
mon option sera désormais Certains(1)
mon option sera désormais Aucun.