Внутри моей функции я построю результирующий набор, заполнив новый измененный HashMap данными (если есть лучший способ - я буду благодарен за комментарии). Затем я хотел бы вернуть результирующий набор как неизменный HashMap. Как получить неизменяемый из изменчивого?
Как преобразовать измененный HashMap в неизменный эквивалент в Scala?
Ответ 1
scala> val m = collection.mutable.HashMap(1->2,3->4)
m: scala.collection.mutable.HashMap[Int,Int] = Map(3 -> 4, 1 -> 2)
scala> collection.immutable.HashMap() ++ m
res1: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2, 3 -> 4)
или
scala> collection.immutable.HashMap(m.toSeq:_*)
res2: scala.collection.immutable.HashMap[Int,Int] = Map(1 -> 2, 3 -> 4)
Ответ 2
Обсуждение вопроса о возврате immutable.Map
vs. immutable.HashMap
несмотря на это, просто используя метод toMap
:
scala> val m = collection.mutable.HashMap(1 -> 2, 3 -> 4)
m: scala.collection.mutable.HashMap[Int,Int] = Map(3 -> 4, 1 -> 2)
scala> m.toMap
res22: scala.collection.immutable.Map[Int,Int] = Map(3 -> 4, 1 -> 2)
Как и 2.9, в методе TraversableOnce
используется метод 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
}
Ответ 3
Если у вас есть карта: logMap: Map[String, String]
просто нужно сделать: logMap.toMap()