3

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

从可变映射返回不可变映射的首选 Scala 方式是什么?通常,我会做一个myMap.toMap明显有效但有气味的方法。或者,您可以将返回类型设置为scala.collection.Map不需要构建新集合,但似乎会混淆读者。

感谢您的任何回复。

4

3 回答 3

7

最好的方法是打电话.toMap。它简短、干净,是一种明确的方式,表示您想将您的收藏转换为immutable.Map.

我认为将类型设置为scala.collection.Map确实会令人困惑。它也不会保护您免受将类型设置回来的人的伤害。使类型immutable.Map清晰且安全。

于 2012-04-12T16:35:47.867 回答
5

我不确定你为什么认为.toMap气味,但如果你想明确说明collection.immutable.Map() ++ myMap应该清楚地记录发生了什么。(不要忘记(); 它们不是可选的。)

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

于 2012-04-12T16:38:58.610 回答
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转换为 a mutable.Map,但修改会抛出UnsupportedOperationException.

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

于 2015-08-22T05:44:13.520 回答