2013-02-17 49 views
1

有沒有辦法避免在從一個選項映射時必須將可能爲空的結果包含在另一個選項中。Scala選項映射到另一個選項

option.flatMap(arg => Option(arg.somePotentiallyNullValue)) 

例如像

option.optionMap(arg => arg.somePotentiallyNullValue) 

我只是在我們的代碼庫大量的Java代碼意味着永遠包裹地圖的結果,進一步選擇電話。

+0

的可能(選項)monad。 – 2013-02-17 13:30:56

回答

3

從可空類型到Option的隱式轉換怎麼樣?在範圍上宣佈這個地方:

implicit def toOption[T](x: T) : Option[T] = Option(x) 

後來,編譯器會看着辦吧:

option.flatMap(_.somePotentiallyNullValue) 

由於flatMap預計Option[T]結果值,編譯器使用toOption隱式轉換是這樣的:

option.flatMap(arg => toOption(arg.somePotentiallyNullValue)) 
1

Option的工廠方法會將null變成None

scala> val os1: Option[String] = Option(null) 
os1: Option[String] = None 

附錄

我可能誤解了你的問題......

如果明智地限制它的範圍,你可以使用隱式轉換:

scala> implicit def nullable2Option[T >: Null](t: T): Option[T] = if (t == null) None else Some(t) 
warning: there were 1 feature warnings; re-run with -feature for details 
nullable2Option: [T >: Null](t: T)Option[T] 

scala> val os2: Option[String] = "foo" 
os2: Option[String] = Some(foo) 

scala> val nullS: String = null 
nullS: String = null 

scala> val os3: Option[String] = nullS 
os3: Option[String] = None 

只要有可用的編譯器類型信息用於驅動試圖彌合nullabl的值,這將可用e類型爲Option。例如,調用方法時(類型總是顯式的)。

1

爲了讓事情變得更簡單,你可以引入一個新的類型:在你的代碼,您使用的選項比如

implicit class CheckedOption[T](val option:Option[T]) 

object CheckedOption { 
    @inline implicit def toOption[T](checkedOption:CheckedOption[T]):Option[T] = 
    checkedOption.option.flatMap(Option.apply) 
} 

然後,你做這樣的事情:

def use(o:CheckedOption[String]) = { 
    o map { value => 
    value + "-Some" 
    } getOrElse "None" 
} 

val option1:Option[String] = Some(null) 
val option2:Option[String] = Some("foo") 

use(option1) //> res0: String = None 
use(option2) //> res1: String = foo-Some 
相關問題