从本地构建的可变映射返回不可变映射的首选方法是什么?

时间:2012-04-12 16:34:24

标签: scala scala-collections

我经常发现自己实现了从输入源构建地图的方法。在这种情况下,我使用scala.collection.mutable.Map,假设速度和效率更高;然而,一旦这个集合被构建,我不再希望它是可变的。

从可变映射返回不可变映射的首选Scala方法是什么?通常,我做myMap.toMap这显然有用,但有气味。或者,您可以将返回类型设置为scala.collection.Map,这不需要构建新的集合,但似乎可能会使读者感到困惑。

感谢您的回复。

3 个答案:

答案 0 :(得分:7)

最好的方法是致电.toMap。它简短,干净,并且明确表示您希望将集合转换为immutable.Map

我认为将类型设置为scala.collection.Map确实会让人感到困惑。它也不会保护您免受某人设置类型的影响。使类型immutable.Map清晰且安全。

答案 1 :(得分:5)

我不确定你为什么认为.toMap闻起来,但如果你想要明确collection.immutable.Map() ++ myMap,应该清楚地记录正在发生的事情。 (不要忘记();它们不是可选的。)

简单地更改返回类型并不能完全解决不变性问题;变异方法不再可见,但用户可以轻松地退回。不过,这是最高性能的方法,因为没有什么是真正改变的。

答案 2 :(得分:0)

import scala.collection._
import scala.collection.JavaConversions._

val myMap: mutable.Map[K,V] = ???
val unmodifiable: mutable.Map[K,V] =
  java.util.Collections.unmodifiableMap[K,V](myMap)
val newMap = unmodifiable.asInstanceOf[scala.collection.Map[K,V]]

您可以将newMap投射到mutable.Map,但修改会抛出UnsupportedOperationException

在我的情况下,地图可能足够小,toMap可能更快并且使用更少的内存。