提取值的选项里面考虑到以下几点:从选项斯卡拉
val x = Some(Some(1))
什么是拿到1(或-1,如果一个不存在的),最彻底的方法?
我从数据库查询返回的元组中创建对象实例。元组中的一个值看起来像这样,所以我想要一个简短的'单线程'来获取值或将参数设置为-1。
提取值的选项里面考虑到以下几点:从选项斯卡拉
val x = Some(Some(1))
什么是拿到1(或-1,如果一个不存在的),最彻底的方法?
我从数据库查询返回的元组中创建对象实例。元组中的一个值看起来像这样,所以我想要一个简短的'单线程'来获取值或将参数设置为-1。
x.flatten
是你在找什么。在这里它会给你Some(1)
。 如果你真的想要得到-1
对于其中“的一个根本不存在”的情况下,只是做x.flatten.getOrElse(-1)
:
scala> Some(Some(1)).flatten.getOrElse(-1)
res1: Int = 1
scala> Some(None).flatten.getOrElse(-1)
res2: Int = -1
scala> None.flatten.getOrElse(-1)
res3: Int = -1
这就是我想出:
scala> val x = Some(Some(1))
x: Some[Some[Int]] = Some(Some(1))
scala> val y = x.map(_.getOrElse(-1)).get
y: Int = 1
scala> val x = Some(None)
x: Some[None.type] = Some(None)
scala> val y = x.map(_.getOrElse(-1)).get
y: Int = -1
这只适用于当你的第一级一些不是无
+1这正是我采用的道路之一;-)这和'匹配',但我知道有一种方法可以在一个简单的过程中得到它,但无法回想起来。 Flatten能够做到我寻找的魔力。 – Jack
是的另一种解决方案显然更好。我也经常忘记扁平化。 ;-) –
虽然不是“单线”你可以创建一个函数来提取值。如果你使它通用并且传入默认值,它可能会非常方便。
scala> def fetchFromOptions[A](default: A)(x: Option[Option[A]]) = x match {
| case Some(Some(a)) => a
| case _ => default
| }
fetchFromOptions: [A](default: A)(x: Option[Option[A]])A
scala> fetchFromOptions(-1)(Some(Some(1)))
res0: Int = 1
scala> fetchFromOptions(-1)(Some(None))
res1: Int = -1
如果你确实知道它Some(Some(1))
,那么你可以用无可辩驳的模式匹配表示法:
scala> val ssi1 = Some(Some(1))
ssi1: Some[Some[Int]] = Some(Some(1))
scala> val Some(Some(i1)) = ssi1
i1: Int = 1
如果可以有任意的混合可能None
,那么你就必须使用其他人提出的更谨慎和冗长的形式。
对于那些觉得这是一个奇怪的符号,把它当做你在case
写在match
结构或PartialFunction
文字来匹配一个scrutinee是Some(Some(1))
什么。
换内涵是经常使用这些类型的嵌套结构的一个非常可读的方式:
val x = Some(Some(1))
val result = for {
firstLevel <- x
secondLevel <- firstLevel
} yield {
// We've got an int, now transform it!
(secondLevel * 100).toString
}
结果是一个选项[字符串],当你有两个部分(S)的转换只发生。
你也可以使用模式匹配:
val result2 = for {
Some(v) <- x
} yield {
// We've got a int, now transform it!
(v * 100).toString
}
展平!我读过了,我已经看到了,我用过了......现在只是为了记住它;-) – Jack