Scala选项映射到另一个选项

Scala选项映射到另一个选项,scala,option,Scala,Option,当从一个选项映射时,有没有一种方法可以避免在另一个选项中包装一个可能为空的结果 option.flatMap(arg => Option(arg.somePotentiallyNullValue)) 例如 option.optionMap(arg => arg.somePotentiallyNullValue ) 我只是在我们的代码库中有很多Java代码,这意味着将映射的结果永远包装在进一步的选项调用中。从空类型到选项的隐式转换如何?在范围内的某个地方声明: implicit d

当从一个选项映射时,有没有一种方法可以避免在另一个选项中包装一个可能为空的结果

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

option.optionMap(arg => arg.somePotentiallyNullValue )

我只是在我们的代码库中有很多Java代码,这意味着将映射的结果永远包装在进一步的选项调用中。

从空类型到
选项的隐式转换如何?在范围内的某个地方声明:

implicit def toOption[T](x: T) : Option[T] = Option(x)
稍后,编译器将发现:

option.flatMap(_.somePotentiallyNullValue)
由于
flatMap
期望
Option[T]
作为结果值,编译器使用
toOption
隐式转换,如下所示:

option.flatMap(arg => toOption(arg.somePotentiallyNullValue))
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

从空类型到
选项的隐式转换如何?在范围内的某个地方声明:

implicit def toOption[T](x: T) : Option[T] = Option(x)
稍后,编译器将发现:

option.flatMap(_.somePotentiallyNullValue)
由于
flatMap
期望
Option[T]
作为结果值,编译器使用
toOption
隐式转换,如下所示:

option.flatMap(arg => toOption(arg.somePotentiallyNullValue))
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

选项
的工厂方法将把
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

只要有可用的类型信息可供编译器用来驱动将可为空类型的值桥接到
选项
上的尝试,这就可以工作。例如,当调用一个方法时(类型总是显式的)。

用于
选项的工厂方法将
null
转换为

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

只要有可用的类型信息可供编译器用来驱动将可为空类型的值桥接到
选项
上的尝试,这就可以工作。例如,在调用方法时(类型总是显式的)。

为了简化操作,您可以引入一种新类型:

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)
}
然后在代码中,在使用选项实例的地方,执行如下操作:

option.flatMap(arg => toOption(arg.somePotentiallyNullValue))
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

为了使事情更简单,您可以引入一种新类型:

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)
}
然后在代码中,在使用选项实例的地方,执行如下操作:

option.flatMap(arg => toOption(arg.somePotentiallyNullValue))
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
Maybe(选项)单子Maybe(选项)单子。