从选项映射时,有没有办法避免将可能为空的结果包装在另一个选项中。
option.flatMap(arg => Option(arg.somePotentiallyNullValue))
例如像
option.optionMap(arg => arg.somePotentiallyNullValue )
我的代码库中只有很多 Java 代码,这意味着永远将映射的结果包装在进一步的 Option 调用中。
从可空类型隐式转换到Option
? 在范围内的某处声明:
implicit def toOption[T](x: T) : Option[T] = Option(x)
稍后编译器会弄清楚:
option.flatMap(_.somePotentiallyNullValue)
由于flatMap
期望Option[T]
作为结果值,编译器使用toOption
如下隐式转换:
option.flatMap(arg => toOption(arg.somePotentiallyNullValue))
为了使事情变得更容易,您可以引入一种新类型:
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
工厂方法Option
将 anull
变成 a 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
只要有可用的类型信息供编译器用来驱动尝试将可空类型的值桥接到Option
. 例如,在调用方法时(类型总是显式的)。