我经常发现自己实现了从输入源构建地图的方法。在这种情况下,我使用scala.collection.mutable.Map
,假设速度和效率更高;然而,一旦这个集合被构建,我不再希望它是可变的。
从可变映射返回不可变映射的首选Scala方法是什么?通常,我做myMap.toMap
这显然有用,但有气味。或者,您可以将返回类型设置为scala.collection.Map
,这不需要构建新的集合,但似乎可能会使读者感到困惑。
感谢您的回复。
答案 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
可能更快并且使用更少的内存。