25 votes

Onu-optioning une option Option

Dire que j'ai un val s: Option[Option[String]]. Ainsi, elle peut avoir les valeurs suivantes:

Some(Some("foo")) Some(None) None

Je veux réduire de façon que la première devient Some("foo") , tandis que les deux autres deviennent None. Évidemment, il ya beaucoup de façons de le faire, mais je suis à la recherche d'un moyen simple, peut-être construit en, moins-que-one-liner.

22voto

Rex Kerr Points 94401

C'est une honte qu' flatten n'existe pas. Il le devrait.

s getOrElse None

(en plus des autres réponses) fera la même chose, cependant.

14voto

oxbow_lakes Points 70013

Vous pouvez utiliser scalaz join à le faire, car c'est l'un des monadique opérations:

doubleOpt.join

Ici, il est dans le REPL:

scala> import scalaz._; import Scalaz._
import scalaz._
import Scalaz._

scala> some(some("X")).join
res0: Option[java.lang.String] = Some(X)

scala> some(none[String]).join
res1: Option[String] = None

scala> none[Option[String]].join
res3: Option[String] = None

Il est disponible pour quoi que ce soit avec un typeclass exemple, pour une Monade.

9voto

Dave Griffith Points 12923
s.flatten

suivi par un groupe de personnages pour m'amener jusqu'à la valeur minimale qui permet stackoverflow

4voto

Dean Hiller Points 5292

Je pense que la conversion à l'Itérable est tout simplement parfait. Utilisez ces étapes pour aller d' Option[Option[String] d'un seul Option[String]

s.flatten.headOption 

(qui renvoie Option[String])

1voto

T.Grottker Points 1301

Vous pouvez utiliser flatMap comme suit:

val options = List(Some(Some(1)), Some(None), None)
options map (_ flatMap (a => a))

Ce sera la carte de l' List[Option[Option[Int]]] d'un List[Option[Int]].
Si vous avez juste une Option que vous pouvez l'utiliser comme suit:

val option = Some(Some(2))
val unzippedOption = option flatMap (b => b)

Cela va aplatir votre Option[Option[Int]] de Option[Int].

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X