我在很多例子中看到有时使用Seq,而其他时候是List ......
除了前一个是Scala类型和List来自Java之外,有什么区别吗?
Seq是一个具有已定义元素顺序的Iterable . 序列提供了一种用于索引的方法 apply() ,范围从0到序列的长度 . Seq有许多子类,包括Queue,Range,List,Stack和LinkedList .
apply()
List是一个实现为不可变链表的Seq . 它最适用于具有后进先出(LIFO)访问模式的情况 .
以下是Scala FAQ的完整集合类层次结构:
Seq 是 List 实现的特征 .
Seq
List
如果将容器定义为 Seq ,则可以使用任何实现 Seq trait的容器 .
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)
如果未指定容器类型,则基础数据结构默认为 List .
在Java术语中,Scala的 Seq 将是Java的 List ,而Scala的 List 将是Java的 LinkedList .
LinkedList
请注意 Seq 是 trait ,相当于Java的 interface ,但相当于崭露头角的防御方法 . Scala的 List 是一个由 Nil 和 :: 扩展的抽象类,它们是 List 的具体实现 .
trait
interface
Nil
::
因此,在Java的 List 是 interface 的情况下,Scala的 List 是一个实现 .
除此之外,Scala的 List 是不可变的,而不是 LinkedList 的情况 . 实际上,Java没有等同于不可变集合(只读事物只保证新对象不能更改,但是你仍然可以改变旧的,因此,"read only"一个) .
Scala的 List 由编译器和库高度优化,并且它不适合并行编程 . 这些天, Vector 是比 List 更好的选择,但习惯很难打破 .
Vector
Seq 是一个很好的序列推广,所以如果编程到接口,你应该使用它 . 请注意,实际上有三个: collection.Seq , collection.mutable.Seq 和 collection.immutable.Seq ,后者是导入范围的"default" .
collection.Seq
collection.mutable.Seq
collection.immutable.Seq
还有 GenSeq 和 ParSeq . 后一种方法在可能的情况下并行运行,而前者是 Seq 和 ParSeq 的父级,当代码的并行性还没有使用它们时,它是一种合适的推广 .
GenSeq
ParSeq
在Scala中,List继承自Seq,但实现了Product;这是List的正确定义:
sealed abstract class List[+A] extends AbstractSeq[A] with Product with ...
[注意:the actual definition有点复杂,为了适应和利用Scala非常强大的集合框架 .
4 回答
Seq是一个具有已定义元素顺序的Iterable . 序列提供了一种用于索引的方法
apply()
,范围从0到序列的长度 . Seq有许多子类,包括Queue,Range,List,Stack和LinkedList .List是一个实现为不可变链表的Seq . 它最适用于具有后进先出(LIFO)访问模式的情况 .
以下是Scala FAQ的完整集合类层次结构:
Seq
是List
实现的特征 .如果将容器定义为
Seq
,则可以使用任何实现Seq
trait的容器 .注意
只是一个简短的手:
如果未指定容器类型,则基础数据结构默认为
List
.在Java术语中,Scala的
Seq
将是Java的List
,而Scala的List
将是Java的LinkedList
.请注意
Seq
是trait
,相当于Java的interface
,但相当于崭露头角的防御方法 . Scala的List
是一个由Nil
和::
扩展的抽象类,它们是List
的具体实现 .因此,在Java的
List
是interface
的情况下,Scala的List
是一个实现 .除此之外,Scala的
List
是不可变的,而不是LinkedList
的情况 . 实际上,Java没有等同于不可变集合(只读事物只保证新对象不能更改,但是你仍然可以改变旧的,因此,"read only"一个) .Scala的
List
由编译器和库高度优化,并且它不适合并行编程 . 这些天,Vector
是比List
更好的选择,但习惯很难打破 .Seq
是一个很好的序列推广,所以如果编程到接口,你应该使用它 . 请注意,实际上有三个:collection.Seq
,collection.mutable.Seq
和collection.immutable.Seq
,后者是导入范围的"default" .还有
GenSeq
和ParSeq
. 后一种方法在可能的情况下并行运行,而前者是Seq
和ParSeq
的父级,当代码的并行性还没有使用它们时,它是一种合适的推广 .在Scala中,List继承自Seq,但实现了Product;这是List的正确定义:
[注意:the actual definition有点复杂,为了适应和利用Scala非常强大的集合框架 .