自动在Options中包装参数

M4k*_*4ks 5 scala

在很多场合,我在的形式使用参数OptionNone默认值-这样的:

def foo(bar:Option[String] = None)
Run Code Online (Sandbox Code Playgroud)

这很方便,让我可以轻松省略nulls.但是,如果我这样做,我需要将方法的每次调用都更改为

foo(Some("bar"))
Run Code Online (Sandbox Code Playgroud)

而不是简单的

foo("bar")
Run Code Online (Sandbox Code Playgroud)

然而,这看起来有点多余,因为很明显,当我指定一个值时,它是一个完整的选项.我很确定我可以尝试编写一些隐式转换器来为我做这样的包装 - 不幸的是,我不知道如何.

奖金 - 这是一个理智的事情吗?有没有其他方法来处理"可空"参数问题?

Mic*_*jac 6

我会给你一些选择(双关语).


不要使用可选参数,而是使用Option.apply.当参数不一定是可选的,但您想要处理null传递的可能值时,这很有用.

 def foo(bar: String): ?? = Option(bar)... // operate on the Option[String]
Run Code Online (Sandbox Code Playgroud)

这样做的好处是,Option.apply自动转换nullNone你,所以绝对没有必要使用的if/else.


对非可选参数使用重载.当参数是真正可选的时候更是如此,但是为您提供了传递Option包装或解包的便利.但是,如果不首先null知道类型,就不可能通过这里.

def foo(bar: String): ?? = foo(Option(bar))

def foo(bar: Option[String]): ?? = ???
Run Code Online (Sandbox Code Playgroud)

例:

def foo(bar: String): Option[String] = foo(Option(bar))

def foo(bar: Option[String]): Option[String] = bar.map(_ + "aaa")

scala> foo("bbb")
res7: Option[String] = Some(bbbaaa)

scala> foo(null: String) // The String ascription is necessary here.
res9: Option[String] = None

scala> val str: String = null
scala> foo(str)  // No ascription necessary, since we know the type.
res10: Option[String] = None
Run Code Online (Sandbox Code Playgroud)

隐式转换任何东西Option.

implicit def any2Opt[A](value: A): Option[A] = Option(value)
Run Code Online (Sandbox Code Playgroud)

并保持目前的定义

def foo(bar: Option[String]): ?? = ???
Run Code Online (Sandbox Code Playgroud)

Option然而,隐含地转换为可能导致一些意想不到的结果,所以要小心.