40 votes

Désactivation d'une option en option

Disons que j'ai un val s: Option[Option[String]]. Il peut ainsi avoir les valeurs suivantes :

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

Je veux le réduire pour que le premier devienne Some("foo") tandis que les deux autres deviennent None. Évidemment, il y a beaucoup de façons d'y parvenir, mais je cherche un revêtement simple, peut-être intégré, moins d'un.

36voto

Rex Kerr Points 94401

C'est dommage que flatten n'existe pas. Ça devrait.

L'aplatissement existe maintenant.

Comme avant,

s getOrElse None

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

16voto

oxbow_lakes Points 70013

Vous pouvez utiliser scalaz join pour ce faire, car il s'agit d'une des opérations monadiques :

doubleOpt.join

Le voici dans le RÉPL :

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 tout ce qui a une instance de typeclass pour une Monad.

14voto

Dave Griffith Points 12923
s.flatten

suivi d'un tas de personnages pour m'amener au minimum que permet le débordement

des piles

4voto

Dean Hiller Points 5292

Je pense que la conversion à l'itérable est très bien. Utilisez ces étapes pour passer de Option[Option[String] à un seul Option[String]

s.flatten.headOption 

(qui renvoie Option[String])

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