2011-07-08 6 views
1

可能性の重複:
Why Option[T] ?Scalaのオプション

私はスカラ座での初心者です、私は本当にJavaをヌル間の差のような感覚を感じ、OptionすることはできませんScalaについて 私はどれも対象ではないと私はスカラ座でそのようになめらかに書くならば、それは安全で行くことを知っている:

val map = Map("koko" -> "is a cat") 
val string:Option[String] =map.get("other") 
println(string.map(a=>println(a.toString))) 

私はうまく代わりに例外をスローした結果としてNoneを取得します。 それは面白いです。

しかし、戻り値がSomeでラップされないようにする必要がある場合。 .getを使用して値を返します。

map.get("other").get.map(a=>println(a.toString)) 

私は「一致」を使用してこの問題を処理することができます知っている:私たちの例では

は、それがexceoptionがスローされます。 私はここで、スカラとJavaのどちらのオプションについても好調なことを学ぶ必要があると考えています!

私はまだ得ることができませんでしたが、私の変数の中に存在していたどのように私はオプションの利点を使用しますが、場合に値が存在する可能性があることです、値を返さないSome(value)

def testOption(): String = { 
    val map = Map("koko" -> "is a cat") 
    val string: Option[String] = map.get("koko") 
    string 
} 

私が意味はどのような方法があります戻り値をOption[String]に更新する代わりに、このコードを動作させる! は私がいないOption[String]

がどのように私はそれがmatchの任意の種類なしで動作させることができString型である私の豆変数に設定するために、文字列を返すために持っていることを想像してみて! 私はそれが動作するようなスムーズさがあれば、それは私がよくOptionの力を理解させるようになりますね。

+3

これを読む:http://stackoverflow.com/questions/2079170/why-optiont – OscarRyz

+0

'get'の代わりに' apply'を使うことができます。それはマップに存在するので、正確な値を返します。 – axel22

答えて

6

オプションは実際には非常に便利です。 Javaでは、何かがnullになる可能性があるかどうかを文書化するのは難しいです。 Scalaでは、多くの場合、すべての変数がnullではないと仮定できます。

これは、失敗する可能性のある計算や定義されていない計算がある場合に非常に便利です。あなたがwebappを持っていて、記入されていないユーザーデータがあると、計算が実行できない場合があります。マップにユーザーデータがある場合は、

val myData = map.get(userId).map(doFunction).map(toHtml) 
println(myData.getOrElse(noDataHtml)) 

のようにすることができます。ここでは明らかにnullを心配する必要はありません。ユーザーデータがマップ内にある場合は、計算を進めてhtmlに変換します。それ以外の場合は、デフォルトのhtmlを出力します。 Javaでは、各段階でヌルチェックを行う必要がありますが、Scalaでは関数を連鎖させることができます。

+0

私はその力を感じ始めています。ありがとう。あなたが私と一緒にもっと共有している場合は、確かに:) – Echo

関連する問題