2011-07-08 116 views
1

可能重複:
Why Option[T] ?斯卡拉選項和Java空

我對Scala的新手,我真的不能感覺到Java和Option零之間的差異是感覺在斯卡拉。 我相信沒有一個是一個對象,如果我寫水木清華這樣的斯卡拉,它會安全:

val map = Map("koko" -> "is a cat") 
val string:Option[String] =map.get("other") 
println(string.map(a=>println(a.toString))) 

我順利拿到None結果,而不是拋出異常。 這很有趣。

但是,如果我需要返回值不被Some包裹。我將使用.get來返回值。

在我們的例子中,它會拋出一個exceoption:

map.get("other").get.map(a=>println(a.toString)) 

我知道我可以通過使用「匹配」處理這個問題。 我在這裏,我需要了解什麼是在斯卡拉選項上蓬勃發展vs null在Java!

我仍然無法明白的是,我如何使用期權的優勢,但如果有存在了我的變量值,返回值不Some(value)

def testOption(): String = { 
    val map = Map("koko" -> "is a cat") 
    val string: Option[String] = map.get("koko") 
    string 
} 

我的意思是有什麼辦法使此代碼工作,而不是更新返回值爲Option[String]! 想象一下,我不得不爲了返回一個字符串不Option[String]

我怎麼能作出這樣的作品沒有任何形式的match被設定於我的豆變量的類型爲String! 我想如果有這樣做會使它成功,那會讓我很好地理解Option的威力。

+3

閱讀此:http://stackoverflow.com/questions/2079170/why-optiont – OscarRyz

+0

而不是'get',你可以使用'apply'。它會返回確切的值,因爲它存在於地圖中。 – axel22

回答

6

選項實際上非常有用。在Java中,很難記錄是否可以爲空。在斯卡拉,你可以經常假設所有變量都不爲空。

當你有一些可能失敗或可能未被定義的計算時,這會非常有用。一個好的例子是,如果你有一個web應用程序,並有一些用戶數據沒有填寫,所以計算無法運行。如果在地圖上標明瞭用戶數據,你可以不喜歡

val myData = map.get(userId).map(doFunction).map(toHtml) 
println(myData.getOrElse(noDataHtml)) 

所以很明顯這裏我們從來不用擔心空。如果用戶數據在地圖中,我們繼續進行計算,然後將其轉換爲html。否則,我們只會打印出一個默認的html。在Java中,每個階段我們都必須進行空檢查,但在Scala中,我們可以鏈接函數。

+0

我剛開始感受它的力量,謝謝。當然,如果你有更多與我分享,請隨時:) – Echo