Scala中一个Seq和一个List之间的区别
我曾经在很多例子中看到有时会使用Seq,而其他时间则是List …
除了前者是Scalatypes还是来自Java的List之外,有什么区别吗?
用Java来说,Scala的Seq
是Java的List
,Scala的List
是Java的LinkedList
。
请注意, Seq
是一个trait
,它等同于Java的interface
,但与等同于即将到来的防御方法相同。 Scala的List
是一个由Nil
和::
扩展的抽象类,它们是List
的具体实现。
所以,在Java的List
是一个interface
,Scala的List
是一个实现。
除此之外,斯卡拉的List
是不可变的,这不是LinkedList
的情况。 事实上,Java没有相当于不可变的集合(只读的只保证新的对象不能改变,但你仍然可以改变旧的,因此,“只读”)。
Scala的List
被编译器和库高度优化,它是函数式编程中的基本数据types。 但是它有局限性,并不适合并行编程。 现在, Vector
比List
更好,但是习惯很难打破。
Seq
是Seq
的一个很好的概括,所以如果你编程接口,你应该使用它。 请注意,其中有三个: collection.Seq
, collection.mutable.Seq
和collection.immutable.Seq
,后者是导入到作用域的“default”。
还有GenSeq
和ParSeq
。 后者方法在可能的情况下并行运行,前者是Seq
和ParSeq
父代,是代码并行性无关紧要的合适概括。 它们都是相对新引入的,所以人们还没有使用它们。
在Scala中,Listinheritance自Seq,但实现了Product ; 这里是List的正确定义:
sealed abstract class List[+A] extends AbstractSeq[A] with Product with ...
[注意:为了适应和利用Scala非常强大的集合框架, 实际定义稍微复杂一些。]
Seq是一个具有定义的元素顺序的Iterable。 序列提供一个方法apply()
进行索引,范围从0到序列的长度。 Seq有许多子类,包括Queue,Range,List,Stack和LinkedList。
一个列表是一个Seq被实现为一个不可变的链表。 最好在后进先出(LIFO)访问模式的情况下使用。
Seq
是List
实现的一个特性。
如果将容器定义为Seq
,则可以使用任何实现Seq
特性的容器。
scala> def sumUp(s: Seq[Int]): Int = { s.sum } sumUp: (s: Seq[Int])Int scala> sumUp(List(1,2,3)) res41: Int = 6 scala> sumUp(Vector(1,2,3)) res42: Int = 6 scala> sumUp(Seq(1,2,3)) res44: Int = 6
注意
scala> val a = Seq(1,2,3) a: Seq[Int] = List(1, 2, 3)
只是一个简短的手段:
scala> val a: Seq[Int] = List(1,2,3) a: Seq[Int] = List(1, 2, 3)
如果未指定容器types,则基础数据结构默认为List
。