Как преобразовать изменчивый HashMap в неизменный эквивалент в Scala? - PullRequest
13 голосов
/ 30 января 2012

Внутри моей функции я создаю набор результатов, заполняя новый изменяемый HashMap данными (если есть лучший способ - я был бы признателен за комментарии). Затем я хотел бы вернуть набор результатов как неизменный HashMap. Как извлечь неизменяемое из изменяемого?

Ответы [ 3 ]

12 голосов
/ 30 января 2012

Обсуждение о возврате immutable.Map против 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, здесь используется метод toMap в TraversableOnce, который реализован следующим образом:

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
}
8 голосов
/ 30 января 2012
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 голосов
/ 04 октября 2016

Если у вас есть карта: logMap: Map[String, String] просто нужно сделать: logMap.toMap()

...