まめぞうの技術メモ

IT関連で勉強したことをメモします

ScalaのMapとforeachの使い方

さて、今日はScala言語のMap関数、foreach関数の使い方を学習してみたいと思います。

ぼくも勉強がてらこの記事を書いています。

一緒に勉強していきましょう!

勉強

Mapって要は連想配列

まずはMapから!Mapって聞き慣れないのですが、Scalaではよく使う便利な関数みたいで、最初はなんとなく敬遠していました。

が、プログラミング経験者ならなんてことはない。連想配列なんです!

連想配列がわからない人は是非ググってほしいんですが(そういう人はあんまりScalaから始めないと思うけど・・・)、ざっくり言うと、キーと値が対になったセットの固まりです。

下の例を見て下さい。Mapで連想配列を生成して、キー「1つ目」に、「りんご」、キー「2つ目」に「ゴリラ」、キー「3つ目」に「ラッパ」を入れています。

取り出すには、変数名(キー名)です。

object MapTest {
  def main(args: Array[String]): Unit = {
    val map = Map("1つ目" -> "りんご", "2つ目" -> "ゴリラ", "3つ目" -> "ラッパ")
    println(map("1つ目"))
    println(map("2つ目"))
    println(map("3つ目"))
  }
}

これを実行してみると、順番にprintされました。とてもカンタンですね。

printの結果

foreachで連想配列の要素を取り出し

さて、Mapで連想配列を作ったら、その連想配列の要素全部にアクセスするのがforeachです。

連想配列.foreachで中身のkey、valueにアクセスできます。

「_」が各ループの要素を表します。 実物見たほうがわかりやすいので、下の例をどうぞ!

object MapTest {
  def main(args: Array[String]): Unit = {
    val map = Map("1つ目" -> "りんご", "2つ目" -> "ゴリラ", "3つ目" -> "ラッパ")

    map.foreach(
      println(_)
    )

  }
}

実行結果はこちら。 実行結果その2

でも、これだと()がついてて今ひとつ使えないですね。

この()のことをタプルと言います。

タプルを取り出すには、「タプル.1」でキーを取り出し、「タプル.2」で値を取り出しになります。

そして、「print(.1)」と書いてみたら怒られました。理由は不明です。。

ですので、次の項目で説明する無名関数を作って、その中で処理をしていこうと思います。

なぜ無名関数を作るかと言うと、foreachの()の中に処理を長々と書くことができないからです。printだったら怒られないんですが。。

foreachの処理に無名関数を書く

さて、ではforeachの処理の中に、print文だけでなく処理を書くための無名関数を追加してましょう。

早速サンプルコードです。

object MapTest {
  def main(args: Array[String]): Unit = {
    val map = Map("1つ目" -> "りんご", "2つ目" -> "ゴリラ", "3つ目" -> "ラッパ")

    map.foreach({ i=>
      println(i._1)
      println(i._2)
    })
    
  }
}

foreachの()の中に、{}でくくって処理を書きます。

i」がここでは、各ループで渡される要素(タプル)を表します。

先程説明したように、タプルは「タプル.1」でキーを取り出し、「タプル.2」で値を取り出しなので、「i.1」、「i.2」となっています。

結果はこんな感じです。キー、値、キー、値、キー、値 と上から6つprintlnされていますね!

実行結果その3

簡単な例から進めていきましょう

Scalaの解説ページ、何をググっても理屈っぽくて難しいので、極力簡単な例を出して説明してみました。どうたったでしょう?

Map、foreachなど、連想配列系の処理は多用すると思いますので、まずは基礎からしっかり理解した方がいいでしょう。

ぼくもこのページを見返しながら、実装していきたいと思います。