1

オプションからマッピングするときに、nullの可能性のある結果を別のオプション内にラップする必要を回避する方法はありますか?

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

例:

option.optionMap(arg => arg.somePotentiallyNullValue )

コードベースにたくさんのJavaコードがあります。これは、マップの結果をさらにOption呼び出しで永久にラップすることを意味します。

4

3 に答える 3

3

null許容型からnull許容型への暗黙の変換はどうOptionですか?これをスコープ内のどこかで宣言します。

implicit def toOption[T](x: T) : Option[T] = Option(x)

後でコンパイラはそれを理解します:

option.flatMap(_.somePotentiallyNullValue)

flatMapは結果値として期待されるためOption[T]、コンパイラはtoOption次のような暗黙的な変換を使用します。

option.flatMap(arg => toOption(arg.somePotentiallyNullValue))
于 2013-02-17T13:37:26.280 に答える
1

のファクトリメソッドはOptionaを: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許容型の値をにブリッジする試みを駆動するために使用できる利用可能な型情報がある場合はいつでも機能しますOption。たとえば、メソッドを呼び出す場合(タイプは常に明示的です)。

于 2013-02-17T15:16:01.583 に答える
1

物事を簡単にするために、新しいタイプを導入することができます:

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
于 2013-02-17T16:00:58.293 に答える