Help us understand the problem. What is going on with this article?

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

takudo
Flutter/Dart の入門中
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした