我使用play for scala(2.1),並且需要將「Option [Long]」值轉換爲「Long」。在Scala中將選項[x]轉換爲x
我知道該怎麼做相反的,我的意思是:
def toOption[Long](value: Long): Option[Long] = if (value == null) None else Some(value)
但在我而言,我必須要通過的值「選項[龍]」作爲類型到一個方法,它採用「長」。 請任何幫助。
我使用play for scala(2.1),並且需要將「Option [Long]」值轉換爲「Long」。在Scala中將選項[x]轉換爲x
我知道該怎麼做相反的,我的意思是:
def toOption[Long](value: Long): Option[Long] = if (value == null) None else Some(value)
但在我而言,我必須要通過的值「選項[龍]」作爲類型到一個方法,它採用「長」。 請任何幫助。
首先,您的「相反」實施有一些嚴重的問題。將一個名爲Long
的類型參數放在您正在從標準庫中映射Long
類型的方法上。你可能指的是以下代替:
def toOption(value: Long): Option[Long] =
if (value == null) None else Some(value)
即使這是一種荒謬的(因爲scala.Long
是不是引用類型,從來沒有null
),除非你指的是java.lang.Long
,這是一個痛苦和食譜混亂。最後,即使你處理一個引用類型(如String
),你會更好編寫以下,這是完全等價的:
def toOption(value: String): Option[String] = Option(value)
此方法將返回None
當且僅當value
是null
。
爲了解決你的問題,假設我們有以下方法:
def foo(x: Long) = x * 2
你不應該普遍認爲在傳遞一個Option[Long]
到foo
方面,而是「解除」 foo
到Option
通過map
:
scala> val x: Option[Long] = Some(100L)
x: Option[Long] = Some(100)
scala> x map foo
res14: Option[Long] = Some(200)
的Option
整點是模型(在類型級別)一個「空」值的可能性,以避免整個一類問題。NullPointerException
-y問題。在Option
上使用map
可讓您對可能在Option
中的值執行計算,同時繼續對其爲空的可能性進行建模。
作爲另一個答案筆記,也可以使用getOrElse
來「釋放」Option
,但這通常不是Scala中的慣用方法(除非真的有合理的默認值)。
您需要決定當選項爲None
時會發生什麼情況。你提供默認值嗎?
def unroll(opt: Option[Long]): Long = opt getOrElse -1L // -1 if undefined
unroll(None) // -> -1
你也可以拋出一個異常:
def unroll(opt: Option[Long]): Long = opt.getOrElse(throw
new IllegalArgumentException("The option is expected to be defined at this point")
)
unroll(None) // -> exception
在的情況下,使用null
避免,除非你有很好的理由來使用它(opt.orNull
)。
選項是本地化副作用的方法(您的函數可以返回空值)。而良好的作風來解除你的計算以選項(選項爲一價與地圖 & flatMap方法)。
val x = Option[Long](10)
x.map { a => a + 10 }
而且隨着副作用手動處理提取物值:
val res = x match {
case Some(a) => s"Value: $a"
case None => "no value"
}
該方法已經定義期權[A],並且被稱爲得到:
scala> val x = Some(99L)
x: Some[Long] = Some(99)
scala> x.get
res0: Long = 99
問題是調用get None會拋出NoSucheElement異常:
scala> None.get
java.util.NoSuchElementException: None.get
因此,您不會從使用選項類型中獲得任何好處。
因此,如前所述,您可以使用getOrElse如果您可以提供一個合理的默認值或處理異常。
的慣用方式階將用圖或換理解
x map (_ + 1)
res2: Option[Long] = Some(100)
或
for (i <- x) yield i +1
res3: Option[Long] = Some(100)
這正是我要找的。謝謝安德烈亞斯。 – Nandakishore
正如已經提到getOrElse可能是你在回答你的問題找什麼直。
請還請注意,轉換爲一個選項,您可以簡單地說:
val myOption = Option(1)
myOption現在會有一些(1)
val myOption = Option(null)
myOption現在沒有了。
如果你有x選項[長],x.get
會給你龍。
這個答案是錯誤的。如果x是'None'(這是'Option [Long]'的可能值),調用'get'會引發錯誤。 –
我們可以使用x.getOrElse(None) – user3886907
簡單,沒有廢話的答案。 –
+1使用模式匹配來提取可選值。 –