Scalaのオプションを手に入れるよりも良いのはなぜですか?
-
26-10-2019 - |
質問
なぜ使用するのか foreach
, map
, flatMap
などは、使用するよりも優れていると見なされます get
SCALAオプションは?使用する場合isEmpty
電話することができます get
安全に。
解決
まあ、それは「教えてはいけない」に戻ってきます。これらの2つの行を考えてみましょう。
if (opt.isDefined) println(opt.get)
// versus
opt foreach println
最初のケースでは、あなたは中を見ています opt
そして、あなたが見るものに応じて反応します。 2番目のケースでは、あなたはただ言っているだけです opt
あなたがやりたいこと、そしてそれに対処させてください。
最初のケースはあまりにも多くを知っています Option
, 、それの内部ロジックを複製し、壊れやすく、エラーが発生しやすいです(誤って書かれている場合、コンパイル時間エラーの代わりに実行時間エラーになる可能性があります)。
それに加えて、それは構成可能ではありません。 3つのオプションがある場合、理解のための単一がそれらの世話をします。
for {
op1 <- opt1
op2 <- opt2
op3 <- opt3
} println(op1+op2+op3)
と if
, 、物事は厄介になり始めます。
他のヒント
使用する良い理由の1つ foreach
ネストされたオプションで何かを解析しています。あなたが何かを持っているなら
val nestedOption = Some(Some(Some(1)))
for {
opt1 <- nestedOption
opt2 <- opt1
opt3 <- opt2
} println(opt3)
コンソールプリント 1
. 。これをオプションで何かへの参照を保存するクラスがあるケースに拡張する場合、それは別の参照を保存するものであり、包括的にはない/一部のチェックの巨大な「ピラミッド」を避けることができます。
実際の質問にはすでに優れた答えがありますが、もっと Option
-fooあなたは間違いなくチェックアウトする必要があります トニー・モリスのオプションチートシート.
そのようなものを適用する方が便利な理由 map
, foreach
, 、 と flatMap
に直接 Option
使用する代わりに get
そして、関数を実行することは、どちらでも動作します Some
また None
そして、価値があることを確認するために特別なチェックをする必要はありません。
val x: Option[Int] = foo()
val y = x.map(_+1) // works fine for None
val z = x.get + 1 // doesn't work if x is None
の結果 y
これが次のとおりです Option[Int]
, 、IF以来望ましい x
その場合、オプションです y
同様に未定である可能性があります。以来 get
作業しません None
, 、エラーが発生しないことを確認するために、たくさんの余分な作業を行う必要があります。あなたのために行われる余分な仕事 map
.
簡単に言えば:
オプションが定義されている場合にのみ、何かをする必要がある場合(各呼び出しの返品値をキャプチャする必要がない場合)
Some
): 使用するforeach
(各呼び出しの結果を気にかけている場合は、使用してくださいmap
)オプションが定義されている場合は何かをする必要がある場合、そうでない場合は何か他のものを使用する必要があります。
isDefined
IFステートメントでオプションが
Some
, 、またはaの場合のデフォルト値None
: : 使用するgetOrElse
で操作を実行しようとしています get
あなたが電話する必要があるより命令的なスタイルです 何をすべきか、どうするか 。言い換えれば、私たちは物事を口述し、 Options
内部。一方 map,flatmap
私たちが言う場所を行うためのより機能的な方法です 何をすべきかはどうすればいいのか.