取消select一个选项

说我有一个val s: Option[Option[String]] 。 因此它可以有以下值:

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

我想减less它,以便第一个变成Some("foo")而其他两个变成None 。 显然有很多方法可以完成这个任务,但是我正在寻找一个简单的,也许是内置的,不到一个class轮。

这是一个耻辱, flatten不存在。 这应该。

平坦现在确实存在。

像之前一样,

 s getOrElse None 

(除了其他的答案)也会做同样的事情。

你可以使用scalaz join来做到这一点,因为这是一个monadic操作:

 doubleOpt.join 

这里是在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 

它适用于任何Monadtypestypes的实例。

 s.flatten 

后面跟着一堆字符,使我达到了最小的那个stackoverflow允许的

我认为转换到Iterable就好了。 使用这些步骤从Option[Option[String]转到单个Option[String]

 s.flatten.headOption 

(它返回Option[String]

你可以像下面这样使用flatMap:

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

这将把List[Option[Option[Int]]]映射到List[Option[Int]]
如果你只有一个选项,你可以使用它如下:

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

这将使您的Option[Option[Int]]变为Option[Int]

那么,我其实不明白怎么可能只是无(第三种情况)。 如果真的可以只是无,那么我会投票给雷克斯克尔的答案,否则只是.get就足够了:

 scala> Some(Some("foo")).get res0: Some[java.lang.String] = Some(foo) scala> Some(None).get res1: None.type = None