我有兴趣以最有效的方式理解修改不可变集合的模式。
假设例如我想定义以下类(实际的实现可能会重载运算符,但这只是为了说明)。这是最好的方式(在性能/安全性方面)吗?
import scala.collection.immutable.HashMap
class Example[A,B] {
var col = new HashMap[A, B]()
def add(k: A, v: B): Unit = col = col + (k -> v)
def remove(k: A): Unit = col = col - k
}
这种方法是否也可行,在某种程度上我会失踪?
class Example[A,B] extends HashMap[A,B] {
def add(k: A, v: B): Unit = ???
def remove(k: A): Unit = ???
}
答案 0 :(得分:2)
以上评论是正确的。存在不可变数据结构的想法,并且有方法可以做到这一点,但是,您似乎只想坚持可变结构,因为您仍然有var
。
查看免费在线pdf编程Scala here的第17章,其中Odersky讨论了不可变队列的设计和构建。
它的要点是你永远不会真正修改你试图改变的结构,你只需要接受它,查看它,然后根据旧的结构建立一个新结构,无论它是什么你正试图这样做。
与列表背后的理念相同:
val list = List(1,2,3)
1 :: list
println(list)
将打印List(1,2,3)
而不是List(1,1,2,3)
虽然:
val list = List(1,2,3)
val list1 = 1 :: list
println(list1)
打印List(1,1,2,3)
这是一个很好的幻灯片,讨论了一些流行的数据结构及其功能对应物。 Functional Data Structures
答案 1 :(得分:1)
听起来你正试图让不可变的数据结构变得可变。在某些情况下,您需要考虑性能,但鉴于Scala具有持久的数据结构,我会关注用例而不是性能模型。
val a = Map("key1" -> "some value")
val b = a + ("key2" -> "some other value")
现在b
包含两个条目。
如果您确实需要适用于您案例的可变结构,请使用mutable.Map
。