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を進めているのですが、同じような境遇の方の一助になれば幸いです。
ちゃんとコップ本読めってことですよね...