■ はじめに
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