2013-01-17 122 views
5

提取值的选项里面考虑到以下几点:从选项斯卡拉

val x = Some(Some(1)) 

什么是拿到1(或-1,如果一个不存在的),最彻底的方法?

我从数据库查询返回的元组中创建对象实例。元组中的一个值看起来像这样,所以我想要一个简短的'单线程'来获取值或将参数设置为-1。

回答

15

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 
+1

展平!我读过了,我已经看到了,我用过了......现在只是为了记住它;-) – Jack

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 

这只适用于当你的第一级一些不是

+0

+1这正是我采用的道路之一;-)这和'匹配',但我知道有一种方法可以在一个简单的过程中得到它,但无法回想起来。 Flatten能够做到我寻找的魔力。 – Jack

+0

是的另一种解决方案显然更好。我也经常忘记扁平化。 ;-) –

1

虽然不是“单线”你可以创建一个函数来提取值。如果你使它通用并且传入默认值,它可能会非常方便。

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 
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))什么。

2

换内涵是经常使用这些类型的嵌套结构的一个非常可读的方式:

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 
    }