有沒有辦法避免在從一個選項映射時必須將可能爲空的結果包含在另一個選項中。Scala選項映射到另一個選項
option.flatMap(arg => Option(arg.somePotentiallyNullValue))
例如像
option.optionMap(arg => arg.somePotentiallyNullValue)
我只是在我們的代碼庫大量的Java代碼意味着永遠包裹地圖的結果,進一步選擇電話。
有沒有辦法避免在從一個選項映射時必須將可能爲空的結果包含在另一個選項中。Scala選項映射到另一個選項
option.flatMap(arg => Option(arg.somePotentiallyNullValue))
例如像
option.optionMap(arg => arg.somePotentiallyNullValue)
我只是在我們的代碼庫大量的Java代碼意味着永遠包裹地圖的結果,進一步選擇電話。
從可空類型到Option
的隱式轉換怎麼樣?在範圍上宣佈這個地方:
implicit def toOption[T](x: T) : Option[T] = Option(x)
後來,編譯器會看着辦吧:
option.flatMap(_.somePotentiallyNullValue)
由於flatMap
預計Option[T]
結果值,編譯器使用toOption
隱式轉換是這樣的:
option.flatMap(arg => toOption(arg.somePotentiallyNullValue))
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
。例如,調用方法時(類型總是顯式的)。
爲了讓事情變得更簡單,你可以引入一個新的類型:在你的代碼,您使用的選項比如
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
的可能(選項)monad。 – 2013-02-17 13:30:56