2013-11-04 25 views
13

我使用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) 

但在我而言,我必須要通過的值「選項[龍]」作爲類型到一個方法,它採用「長」。 請任何幫助。

回答

22

首先,您的「相反」實施有一些嚴重的問題。將一個名爲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當且僅當valuenull

爲了解決你的問題,假設我們有以下方法:

def foo(x: Long) = x * 2 

你不應該普遍認爲在傳遞一個Option[Long]foo方面,而是「解除」 fooOption通過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中的慣用方法(除非真的有合理的默認值)。

1

您需要決定當選項爲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)。

2

選項是本地化副作用的方法(您的函數可以返回空值)。而良好的作風來解除你的計算以選項(選項爲一價與地圖 & 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" 
} 
+2

+1使用模式匹配來提取可選值。 –

5

該方法已經定義期權[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) 
+1

這正是我要找的。謝謝安德烈亞斯。 – Nandakishore

0

正如已經提到getOrElse可能是你在回答你的問題找什麼直。

請還請注意,轉換爲一個選項,您可以簡單地說:

val myOption = Option(1) 

myOption現在會有一些(1)

val myOption = Option(null) 

myOption現在沒有了。

28

如果你有x選項[長],x.get會給你龍。

+3

這個答案是錯誤的。如果x是'None'(這是'Option [Long]'的可能值),調用'get'會引發錯誤。 –

+5

我們可以使用x.getOrElse(None) – user3886907

+1

簡單,沒有廢話的答案。 –