ただ日々を記すもの

意識高めを装うことができます

【Scala】IntelliJが教えてくれたちょっと良いこと

現在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以外の数字があった場合
    もちろんtrue

  • 0の場合
    false

これは、感覚的にもわかりやすい。

map().getOrElse(false)

これは、考えるのがちょっとめんどそう、、

  • まずは、optがNoneの場合。
    mapでの処理は行われず、getOrElseが呼ばれ、falseになります。

  • 次に0以外の数字があった場合
    条件がtrueになり、trueが返却されます

  • 0の場合
    falseが返却

こんな感じ。なんとなくはわかりますね。
opt.map(p).getOrElse(true)の場合は、
opt.forall(p)で同等の処理が行われる。