Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
29
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@takudo

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
29
Help us understand the problem. What are the problem?