Programing

변경 가능한 맵을 변경 불가능한 맵으로 변환

lottogame 2020. 11. 2. 07:34
반응형

변경 가능한 맵을 변경 불가능한 맵으로 변환


private[this]object MMMap extends  HashMap[A, Set[B]] with MultiMap[A, B]

불변으로 변환하는 방법은 무엇입니까?


변경 불가능한 계층 구조는 MultiMap을 포함하지 않으므로 동일한 편리한 구문으로 변환 된 구조를 사용할 수 없습니다. 그러나 키 / 값 집합 쌍을 처리하는 데 만족한다면 다음을 수행하십시오.

변경 가능한을 원하면 2.8 또는 2.7에서 HashMap사용할 수 있습니다 .x.toMapcollection.immutable.Map(x.toList: _*)

그러나 기본 집합을 포함하여 전체 구조를 변경할 수 없도록하려면 더 많은 작업을 수행해야합니다. 그 과정에서 집합을 변환해야합니다. 2.8에서 :

x.map(kv => (kv._1,kv._2.toSet)).toMap

2.7에서 :

collection.immutable.Map(
  x.map(kv => (kv._1,collection.immutable.Set(kv._2.toList: _*))).toList: _*
)

scala> val mutableMap = new HashMap[Int, String]
mutableMap: scala.collection.mutable.HashMap[Int,String] = Map()

scala> mutableMap += 1 -> "a"
res5: mutableMap.type = Map((1,a))

scala> mutableMap
res6: scala.collection.mutable.HashMap[Int,String] = Map((1,a))

scala> val immutableMap = mutableMap.toMap
immutableMap: scala.collection.immutable.Map[Int,String] = Map((1,a))

scala> immutableMap += 2 -> "b"
<console>:11: error: reassignment to val
       immutableMap += 2 -> "b"
                ^

myMap.toMapScala 2.8 및 이후 버전에서 변경 가능한 맵을 변경 불가능한 맵으로 변환하는 데 사용할 수 있습니다 .

toMap문서 에서 정의 살펴보기 :

def toMap[T, U](implicit ev: A <:< (T, U)): immutable.Map[T, U] = {
  val b = immutable.Map.newBuilder[T, U]
  for (x <- self) b += x
  b.result
}

다음과 같이 할 수 있습니다.

val imm_map = MMMap.toMap

참고 URL : https://stackoverflow.com/questions/2817055/converting-mutable-to-immutable-map

반응형