修改不可变集合的惯用法

时间:2015-10-15 19:09:49

标签: scala

我有兴趣以最有效的方式理解修改不可变集合的模式。

假设例如我想定义以下类(实际的实现可能会重载运算符,但这只是为了说明)。这是最好的方式(在性能/安全性方面)吗?

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 = ???
}

2 个答案:

答案 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