通常,我发现自己实现了从输入源构建 Map 的方法 . 在这种情况下,我使用 scala.collection.mutable.Map ,假设速度和效率更高;然而,一旦这个集合被构建,我不再希望它是可变的 .
scala.collection.mutable.Map
从可变映射返回不可变映射的首选Scala方法是什么?通常,我做了 myMap.toMap ,这显然有效,但闻起来 . 或者,您可以将返回类型设置为 scala.collection.Map ,这不需要构建新集合,但似乎可能会使读者感到困惑 .
myMap.toMap
scala.collection.Map
谢谢你的回复 .
最好的方法是拨打 .toMap . 它简短,干净,并且明确表示您希望将您的收藏转换为 immutable.Map .
.toMap
immutable.Map
我认为将类型设置为 scala.collection.Map 确实会让人感到困惑 . 它也不会保护您免受某人设置类型的影响 . 使类型 immutable.Map 清晰且安全 .
我不确定你为什么认为 .toMap 闻起来,但如果你想要明确 collection.immutable.Map() ++ myMap 应该清楚地记录发生了什么 . (别忘了 () ;它们不是可选的 . )
collection.immutable.Map() ++ myMap
()
简单地改变返回类型并不能完全解决不变性问题;变异方法不再可见,但用户可以轻松地退回 . 然而,这是最高性能的方法,因为没有什么是真正改变的 .
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 .
newMap
mutable.Map
UnsupportedOperationException
就我而言, Map 可能足够小,以至于可能更快并且使用更少的内存 .
3 回答
最好的方法是拨打
.toMap
. 它简短,干净,并且明确表示您希望将您的收藏转换为immutable.Map
.我认为将类型设置为
scala.collection.Map
确实会让人感到困惑 . 它也不会保护您免受某人设置类型的影响 . 使类型immutable.Map
清晰且安全 .我不确定你为什么认为
.toMap
闻起来,但如果你想要明确collection.immutable.Map() ++ myMap
应该清楚地记录发生了什么 . (别忘了()
;它们不是可选的 . )简单地改变返回类型并不能完全解决不变性问题;变异方法不再可见,但用户可以轻松地退回 . 然而,这是最高性能的方法,因为没有什么是真正改变的 .
您可以将
newMap
转换为mutable.Map
,但修改将抛出UnsupportedOperationException
.就我而言, Map 可能足够小,以至于可能更快并且使用更少的内存 .