LoginSignup
32
29

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-01-26

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

32
29
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
29