117

私がメソッドを持っているが、session.get(str: String): StringそれがJavaから来ているので、それが文字列を返すのかnullを返すのかわからないとします。

代わりにScalaでこれを処理する簡単な方法はありsession.get("foo") == nullますか?たぶん、いくつかの魔法が次のようToOption(session.get("foo"))に適用され、それから私はそれをScalaのように扱うことができます

ToOption(session.get("foo")) match {
    case Some(_) =>;
    case None =>;
}
4

4 に答える 4

202

Optionコンパニオンオブジェクトのメソッドapplyは、null許容参照からの変換関数として機能します。

scala> Option(null)
res4: Option[Null] = None

scala> Option(3)   
res5: Option[Int] = Some(3)
于 2011-01-14T15:22:57.547 に答える
20

Optionオブジェクトには、applyまさにそれを行うメソッドがあります。

var myOptionalString = Option(session.get("foo"));
于 2011-01-14T15:23:39.280 に答える
5

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
于 2018-06-12T06:42:44.047 に答える
-2

これは非常に古いトピックですが、素晴らしいトピックです。

Try to Optionの例外以外の結果を変換すると、いくつかの結果が得られるのは事実です...

scala> Try(null).toOption
res10: Option[Null] = Some(null)

... Tryはnull可能性チェックではなく、機能的に例外を処理する方法であるためです。

Try to catch例外を使用し、それを便宜上Optionに変換すると、例外が発生した場合にのみNoneが表示されます。

scala> Try(1/0).toOption
res11: Option[Int] = None

Tryから得られる値を保持する必要があります。それはnullかもしれません。

しかし、標準のライブラリが時々非常に混乱していることも事実です...

scala> Try(null).toOption
res12: Option[Null] = Some(null)

scala> Option(null)
res13: Option[Null] = None

この動作は少し一貫性がありませんが、TryとOptionの両方の意図された使用法を反映しています。

tryを使用して、例外をスローする可能性のある式から出てくるものをすべて取得します。例外自体は気にしません。

出てくる可能性のある値は、nullである可能性があります。toOptionでNoneが指定された場合、例外とnullを区別できません。これは、見栄えがよくありません。

スタンドアロンでは、Optionを使用して、何かの存在の有無をカプセル化します。したがって、その場合、Some(null)はNoneであり、それは理にかなっています。その場合のnullは、何かが存在しないことを表すからです。ここにあいまいさはありません。

.toOptionはOption()と同じではないため、どのような場合でも参照透過性が損なわれないことに注意することが重要です。

例外安全性とnull安全性の両方を実際に適用する必要があり、コードが実際に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)

...またはそれらのばかばかしいほど醜い他のもの..。

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)
于 2019-09-06T13:22:34.873 に答える