取消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