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。 但是它有局限性,并不适合并行编程。 现在, VectorList更好,但是习惯很难打破。

SeqSeq的一个很好的概括,所以如果你编程接口,你应该使用它。 请注意,其中有三个: collection.Seqcollection.mutable.Seqcollection.immutable.Seq ,后者是导入到作用域的“default”。

还有GenSeqParSeq 。 后者方法在可能的情况下并行运行,前者是SeqParSeq父代,是代码并行性无关紧要的合适概括。 它们都是相对新引入的,所以人们还没有使用它们。

在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)访问模式的情况下使用。

SeqList实现的一个特性。

如果将容器定义为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