为什么Scala Collections API中的集合和列表之间缺乏一致性?
例如,存在不可变的Set,但也是可变的Set . 如果我想使用后者,我可以简单地这样做:
val set = Set[A]()
set += new A
但是,本身没有可变列表 . 如果我想使用Lists编写类似的代码片段,使用哪种数据结构? LinkedList听起来很好,因为它是可变的,但没有定义=方法 . ListBuffer似乎满足要求,但它不是一个列表 .
阅读2.8 Collections文档后,我得出结论MutableList可能是最合适的 .
我仍然希望有scala.collection.mutable.List .
5 回答
这样做的原因是Java已经选择了函数
List
类型来表示它不是(即java.util.List
不是列表) .对于函数式编程语言来说,拥有一个可变的
List
可能没有任何意义,因为这样的类型是矛盾的 . 因此ListBuffer
或ArrayBuffer
. 或者只使用IndexedSeq
,其中有可变和不可变的实现Scala集合库中
Set
的序列/列表类似物是Seq
.List
只是Seq
的一个特定的,不可变的实现,Vector
也是如此 .ArrayBuffer
或ListBuffer
是mutable.Seq
的典型实现 .ArraySeq可能就是你要找的东西,除了=特别慢 . 您还可以使用java.util.ArrayList并导入collection.JavaConversions._
似乎Scala缺少一个具有恒定时间索引的类似List的可变集合(如java的ArrayList) .
在任何情况下,请注意“List”指的是“scala.immutable.List”类型 . 因此,如果要对不可变/可变集合进行概括,则Seq(或其他一些更抽象的集合类型)是您在方法中应该期望的类型而不是“List” .
更理想的是需要一个IndexedSeq,这意味着索引操作对该集合具有高效性 . 但是,我不确定ListBuffer是否属于该类别 .
因为
Set
只是一个特征 - 它是抽象的并且需要实现 . 所以可以说mutable.Set
或immutable.Set
这样的类 .同时,
List
是一个类,是(抽象)特征immutable.LinearSeq
的一个实现 . 永远不会有任何其他类也是List
. 但是,你会发现有一个mutable.LinearSeq
特征 .在Java术语中,您将接口与类进行比较 - 它们是不同的 .
别忘了
scala.collection.mutable.{LinkedList,DoubleLinkedList}
. 它们是可变的,它们是LinearSeq
. 变异有点奇怪 - 您可以通过分配elem
引用来修改头部,并通过分配next
引用来修改尾部 .例如,此循环将所有负值更改为零 .
此循环从列表中删除每个第二个元素 .
我并不是说这些比不可变列表更好 . 我只是指出Scala有可变列表,看起来与您在数据结构类中看到的非常相似 .