【Scala】Scala ~ mutable collection ~

■ はじめに

https://dk521123.hatenablog.com/entry/2023/03/13/000345
https://dk521123.hatenablog.com/entry/2023/09/07/223422

の続き。
前回は、immutable のコレクションを扱ったが
今回は、mutable のコレクションを取り上げる。

 きっかけとしては、
Scala の scala.collection.mutable.Map で
getOrElseUpdate() ってのを知ったので、
その周辺も徐々にではあるがまとめておく

目次

【1】immutable / mutable
 1)immutable (不変)
 2)mutable (可変)
【2】Map
 1)update
 2)getOrElseUpdate
【3】相互変換(immutable ⇔ mutable)

【1】immutable / mutable

* Scala は、基本、immutable

例:Map

// Scalaでは、何も設定せずMapと書いた場合、
// scala.collection.immutable.Map が使われる
val mapper = Map("A" -> 1, "B" -> 2, "C" -> 3)

// mutable を使う場合
val mutableMapper = scala.collection.mutable.Map(
  "A" -> 1, "B" -> 2, "C" -> 3)

1)immutable (不変)

* 上書き可能
 => コレクションの要素を変更、追加、削除が可能

2)mutable (可変)

* 変わることが無い
 => 追加、削除、更新を模倣した演算は提供されるが、
  新しいコレクションを返す
 => 古いコレクションは変わることがない

【2】Map

https://docs.scala-lang.org/ja/overviews/collections/maps.html

1)update

* mutable を更新するメソッド

2)getOrElseUpdate

* メモリ内にキャッシュするために使える便利メソッド

構文:map.getOrElseUpdate (key, value)

* マップ map内にキー key が...
 + 定義されている場合は、その値を返す
 + 定義されていない場合は、map に key -> value を加え、value を返す。

サンプル

import java.text.DateFormat

object Hello {
  val cache = scala.collection.mutable.Map[String, String]()
  def main(args: Array[String]): Unit = {
    // [1] a
    println(s"[1] ${cache.getOrElseUpdate ("A", "a")}")
    // [2] b
    println(s"[2] ${cache.getOrElseUpdate ("B", "b")}")
    // [3] c
    println(s"[3] ${cache.getOrElseUpdate ("C", "c")}")
    // ==== 違う値で実験
    // [4] a <- [1]の値を返している
    println(s"[4] ${cache.getOrElseUpdate ("A", "X")}")
    // [5] c <- [3]の値を返している
    println(s"[5] ${cache.getOrElseUpdate ("C", "Y")}")
    // [6] b <- [2]の値を返している
    println(s"[6] ${cache.getOrElseUpdate ("B", "Z")}")
  }
}

【3】相互変換(immutable ⇔ mutable)

// immutable -> mutable
val mutableMap = mutable.Map.empty ++ map

// mutable -> immutable
val immutableMap = Map.empty ++ mutableMap

サンプル

import scala.collection.mutable

object Hello {
  def main(args: Array[String]): Unit = {
    val map = Map("a" -> 1, "b" -> 2, "c" -> 3)

    // immutable -> mutable
    val mutableMap = mutable.Map.empty ++ map

    mutableMap.foreach { case (key, value) =>
        println(s"$key - $value")
    }
    mutableMap.update("d", 4)

    println("**************")

    // mutable -> immutable
    val immutableMap = Map.empty ++ mutableMap

    immutableMap.foreach { case (key, value) =>
      println(s"$key - $value")
    }
  }
}

参考文献

https://docs.scala-lang.org/ja/overviews/collections/overview.html
https://docs.scala-lang.org/ja/overviews/collections/concrete-mutable-collection-classes.html
https://plasticscafe.hatenadiary.org/entry/20100903/1283486354

関連記事

Scala ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/03/10/193805
Scala ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/03/12/184331
Scala ~ 基本編 / コレクション ~
https://dk521123.hatenablog.com/entry/2023/03/13/000345
Scala ~ コレクションで使えるメソッド ~
https://dk521123.hatenablog.com/entry/2023/09/07/223422
Scala ~ 基本編 / 日付・日時 ~
https://dk521123.hatenablog.com/entry/2023/03/08/000000