現在IntelliJを使ってScalaで開発を行っているわけです。
まだまだ初心者な自分はやたらmapとかmatchとかを乱用して、乱用した結果出てくるエラーを徐々に消して地道に開発を行っています...
そんな折、大好きなmapを使って下のような実装をしたところIntelliJがやたらとハイライトをかけて目立たせてきました
※もちろん実装は仮です
val opt = Option(1) val result = opt.map(_ != 0).getOrElse(false)
ちなみに、でていたメッセージが
Replaces map and getOrElse (false/true) with exisits/forall.
というもの。
とりあえず、言われた通りに
val opt = Option(1) val result2 = opt.exists(_ != 0)
に修正してみると、ハイライトも消え、挙動も以前のものと変わらない結果になりました。
挙動について考える
少し二つの挙動について考えてみる。
exists
まずはわかりやすいexistsメソッドから。
こちらは引数に渡された条件に含まれる要素が一つでも該当すれば(trueとなれば)、結果としてtrueを返します。
なので、変数opt
に0以外の数字が含まれていた場合、trueとなります。
もちろん、ひとつも該当しなければ、false。
opt
がNoneの場合。
該当するものがないため、falseが返却次に0以外の数字があった場合
もちろんtrue0の場合
false
これは、感覚的にもわかりやすい。
map().getOrElse(false)
これは、考えるのがちょっとめんどそう、、
まずは、
opt
がNoneの場合。
mapでの処理は行われず、getOrElseが呼ばれ、falseになります。次に0以外の数字があった場合
条件がtrueになり、trueが返却されます0の場合
falseが返却
こんな感じ。なんとなくはわかりますね。
opt.map(p).getOrElse(true)
の場合は、
opt.forall(p)
で同等の処理が行われる。