Scalaにオプションを使用してJavaでnull-returningメソッドを包みますか?
-
11-10-2019 - |
質問
方法があるとします session.get(str: String): String
しかし、それがジャワから来ているので、それがあなたに文字列とヌルを返すかどうかはわかりません。
これをScalaで代わりに処理する簡単な方法はありますか session.get("foo") == null
?たぶんいくつかの魔法が似ています ToOption(session.get("foo"))
そして、私はそれをScalaのように扱うことができます
ToOption(session.get("foo")) match {
case Some(_) =>;
case None =>;
}
解決
Option
コンパニオンオブジェクト apply
メソッドは、ヌル可能な参照からの変換関数として機能します。
scala> Option(null)
res4: Option[Null] = None
scala> Option(3)
res5: Option[Int] = Some(3)
他のヒント
Option
オブジェクトには apply
まさにそれを行う方法:
var myOptionalString = Option(session.get("foo"));
Javaオブジェクトを使用する場合、予想どおりに機能しないことに注意してください。
val nullValueInteger : java.lang.Integer = null
val option: Option[Int] = Option(nullValueInteger)
println(option) // Doesn't work - zero value on conversion
val nullStringValue : String = null
val optionString: Option[String] = Option(nullStringValue)
println(optionString) // Works - None value
これは非常に古いトピックですが、いい話です!
オプションを選択することの非執行結果を変換すると、いくつかの結果が生じることは事実です...
scala> Try(null).toOption
res10: Option[Null] = Some(null)
...試してみることは、無効なチェックに関するものではなく、例外を機能的に処理する方法だけだからです。
例外をキャッチして、それを便利なためにオプションに変換することを試みて、例外が発生した場合にのみ表示されません。
scala> Try(1/0).toOption
res11: Option[Int] = None
あなたは試してみることから出てくる価値を維持したいです。それはヌルかもしれません。
しかし、標準的なLIBが時々非常に混乱していることも事実です...
scala> Try(null).toOption
res12: Option[Null] = Some(null)
scala> Option(null)
res13: Option[Null] = None
この動作は少し矛盾していますが、試行の両方の意図的な使用法を反映しています。
例外を投げかける可能性のある表現から出てくるものは何でも取得してみてください。例外自体を気にしません。
出てくるかもしれない値はヌルかもしれません。 Tooptionが何も与えなかった場合、 例外とnullの間で違いはありません, 、それはきれいではありません!
スタンドアロンでは、オプションを使用して、何かの存在をカプセル化します。したがって、その場合、いくつか(null)はありません。その場合、その場合は何かがないことを表しているため、それは理にかなっています。ここには曖昧さはありません。
.tooptionはあるので、いずれにせよ、参照の透明性は壊れていないことに注意することが重要です いいえ option()と同じ
本当に強制する必要がある場合 両方とも 例外安全 と ヌルの安全性とコード 本当に本当にnullと例外を違いなくする必要はありません, 、両方のパラダイムを組み合わせるだけです!まあ、それはあなたが望むものだからですよね?
あなたはそれを1つの方法で行うことができます...
scala> Try(Option(null)).getOrElse(None)
res23: Option[Null] = None
scala> Try(Option(3/0)).getOrElse(None)
res24: Option[Int] = None
scala> Try(Option(3)).getOrElse(None)
res25: Option[Int] = Some(3)
...または別の...
scala> Try(Option(null)).toOption.flatten
res26: Option[Null] = None
scala> Try(Option(3/0)).toOption.flatten
res27: Option[Int] = None
scala> Try(Option(3)).toOption.flatten
res28: Option[Int] = Some(3)
...または彼らの途方もなくugいのに狂ったように...
scala> Option(Try(null).getOrElse(null))
res29: Option[Null] = None
scala> Option(Try(3/0).getOrElse(null))
res30: Option[Any] = None
scala> Option(Try(3).getOrElse(null))
res31: Option[Any] = Some(3)