2013-01-17 118 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 
    }