Scalaのオプションを手に入れるよりも良いのはなぜですか?

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

  •  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 私たちが言う場所を行うためのより機能的な方法です 何をすべきかはどうすればいいのか.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top