提取值的選項裏面考慮到以下幾點:從選項斯卡拉
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