2013-12-20 107 views
2

我是新來斯卡拉&人人講,它是壞的斯卡拉斯卡拉:在一個塊

使用類似if myFoo.get is null thenmyFoo被包裹在一個Option(如Option[myFoo])「getOrElse」我繼續來跨越getOrElse但引用getOrElse的所有答案讓我更加困惑,儘管它聽起來很簡單(「getOrElse」)。


這是我正在嘗試做的。如果myFoo爲空,則執行something,但是如果不是,則執行somethingElse

可能有人請解釋一下對我來說可能是最簡單的方法是什麼?不一定是一個長的答案,但我會很感激所有我能得到的幫助。

回答

7

它看起來像你沒有一個Option,但一些價值可能是null

如果myFoo是空

在這種情況下,你有Option來包裝它:Option(myFoo)

val result = Option(myFoo) match { 
    case Some(value) => 
    // something 
    // you could use `value` here 
    case None => 
    // something else 
} 

Option(myFoo)包裝myFooOption:如果它是null你會得到None否則你會得到Some(myFoo)

看到這篇文章:scala.Option Cheat Sheet的方法與Option工作。

而且看一看this answer

請注意,如果myFooOption,則不需要包裝它:將Option(myFoo) match替換爲myFoo match

另外,應注意的是get對空Option(上None)拋出一個異常,而不是返回null

如果myFoo.get爲null,則

你會得到一個異常,而不是null。你永遠不應該使用get

+0

完美。謝謝:) – goo

+0

@Jon:請注意,如果'myFoo'實際上是一個'Option',則不需要包裝 - 用'myFoo match'替換'Option(myFoo)match'。 – senia

+0

正確,thx爲鏈接。真的有幫助。 – goo

2

選項可以有兩種類型:一些與無。 None表示某個包含值的缺失,而Some表示它具有值。將Option看作1個元素的列表。所以當你做一個getOrElse時,你真正說的是給我那個價值,或者如果是空的,給我另一個價值。

+0

謝謝。這個答案和@ senia's對我來說非常清楚 – goo