Scalaにオプションを使用してJavaでnull-returningメソッドを包みますか?

StackOverflow https://stackoverflow.com/questions/4692506

  •  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)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top