JavaやC#においてはMapオブジェクトというのは後で何かを追加して使いまわすために
用いられる『ミュータブルオブジェクト』という扱いが基本です。
ですが、scalaのような関数型言語では『イミュータブルオブジェクト』として扱うのが基本だそうな。
実際、Mapにも「scala.collection.mutable.Map」と、「scala.collection.immutable.Map」として
2種類クラスツリーが存在していています。
クラス名称的には微妙にわかりにくい気もしますが。
で、動作も下記のように違ってきています。
■ImmutableMapObjectMain.scala
package jp.gr.kmtn.scalatutorial.grammertips
import scala.collection.immutable.Map
/**
* イミュータブルMapテスト用メインクラス
*
* @author Fukushi-
*/
object ImmutableMapObjectMain {
/**
* イミュータブルMapテスト用プログラムエントリポイント
*/
def main(args: Array[String]): Unit =
{
val immutableMapFirst = Map(1 -> "One", 2 -> "Two")
val immutableMapSecond = immutableMapFirst + (3 -> "Three")
Console.println(immutableMapSecond.toString);
}
}
■MutableMapObjectMain.scala
package jp.gr.kmtn.scalatutorial.grammertips
import scala.collection.mutable.Map
/**
* ミュータブルMapテスト用メインクラス
*
* @author Fukushi-
*/
object MutableMapObjectMain {
/**
* ミュータブルMapテスト用プログラムエントリポイント
*/
def main(args: Array[String]): Unit =
{
val mutableMapFirst = Map[Int, String](1 -> "One", 2 -> "Two")
mutableMapFirst += (3 -> "Three")
Console.println(mutableMapFirst.toString);
}
}
実行結果はどちらも下記のようになります。
■実行結果
Map(3 -> Three, 1 -> One, 2 -> Two)
イミュータブルなMapの場合、+メソッドを使って新しいMapを生成する形で要素を追加。
ミュータブルなMapの場合、+=メソッドを使って新しい要素を追加する形になります。
イミュータブルMapの場合、既存のオブジェクトに影響を与えないことが保障されますが、
要素の追加を行う度に新規Mapが生成されるため、下手すると性能問題になるかもしれません。
ミュータブルMapの場合、既存のオブジェクトに追加されるため性能的には優れそうですが、
いつの間にか状態が変わっている可能性が出てきます。
この辺りを考慮して使い分けるのがよさそうです。
何にしても、使い分けられるのはいいですね。
scalaで出来ることを並べてみる:Map
登録:
コメントの投稿 (Atom)
0 コメント:
コメントを投稿