Я дам вам несколько вариантов (каламбур).
Не используйте необязательный параметр, и вместо этого использовать Option.apply
. Это полезно, когда параметр необязательно является необязательным, но вы хотите иметь дело с возможными передаваемыми значениями null
.
def foo(bar: String): ?? = Option(bar)... // operate on the Option[String]
Преимущество этого в том, что Option.apply
автоматически преобразует null
в None
для вас, так что нет абсолютно никакой необходимости в использовании, если/другое.
Использовать перегрузку для необязательных параметров. Это более того, когда параметр действительно является необязательным, но дает вам возможность пройти Option
, завернутый или развернутый. Невозможно передать null
здесь, не зная сначала тип.
def foo(bar: String): ?? = foo(Option(bar))
def foo(bar: Option[String]): ?? = ???
Пример:
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
Косвенно преобразовать все, чтобы Option
.
implicit def any2Opt[A](value: A): Option[A] = Option(value)
И сохранить текущий definintion из
def foo(bar: Option[String]): ?? = ???
Косвенно превращающего в Option
, однако, может привести к некоторым неожиданным результатам, так что будьте осторожны.
Опция (null) равна None. – mohit