Edited at

【Scala】OptionとListのmap()に感動する

More than 5 years have passed since last update.

mapってメソッドがいくつかのクラスにあります。

特にOptionとListについては感動したので、感動を分かち合いたいと思います。


Option


val optIntVal: Option[Int] = Some(10)
val optStrVal: Option[String] = Some("文字列だす")

こんな感じでOption[***]の変数があったとしましょう。

個人的に一番使うのが多いのが、このOptionに対してgetOrElseでStringの引数を呼び出すことです。


val strVal = optStrVal.getOrElse("") //よくやる


改善前

しかし、Option[Int]のgetOrElseで結果的にStringにしたい、ということも良くありまして、その際は最近まではこう書いてました。

var strVal = ""

if(optIntVal.isDefined){
strVal = optIntVal.get.toString
}


改善後

型変換が絡むと、とたんにgetOrElseが使えないと思ってたからですね。

書きながらも、かなり気持ち悪がってました。

ご存じの方も多いと思いますが、解決策としてはこちら

val strVal = optStrVal.map(_.toString).getOrElse("") //1行で書けた!

map()が肝ですね。

プレースホルダーとして「_」が使えます。これがOptionの場合は中身を意味しています。

わかりやすく書くとこうです。

val optStrValForConvert:Option[String] = optStrVal.map(_.toString) //Option[Int]から、Option[String]への変換

val strVal = optStrValForConvert.getOrElse("")


List

map()内でプレースホルダーが使えることが分かれば、Listの場合も何となくイメージできますよね。

こんなリストを想定します。

val strList = List("1", "2", "3")

val intList = List(1, 2, 3)

それぞれList[Int]と、List[String]に変換しましょう。


改善前

恥ずかしいですけど改善前です。

val newIntListForConvert = ListBuffer()[Int]

strList.foreach{ str =>

//今思い返しても恥ずかしい…
newIntListForConvert += str.toInt
}

val newIntList = newIntListForConvert.toList


改善後

Listにもmap()が備わっているので使います。

val newIntList = strList.map(_.toInt) //なんと…

val newStrList = intList(_.toString) //1行で…!

私も完全に独学でScalaを進めているのですが、同じような境遇の方の一助になれば幸いです。

ちゃんとコップ本読めってことですよね...