我在很多例子中看到有时会使用Seq,而其他时候是List ......
除了前一个是Scala类型和List来自Java之外,是否有任何区别?
答案 0 :(得分:346)
在Java术语中,Scala的Seq
将是Java的List
,而Scala的List
将是Java的LinkedList
Seq
1}}。
请注意,trait
是interface
,相当于Java List
,但相当于崭露头角的防御方法。 Scala的Nil
是一个由::
和List
扩展的抽象类,它们是List
的具体实现。
因此,在Java interface
为List
的情况下,Scala的List
是一种实现。
除此之外,Scala的LinkedList
是不可变的,而List
不是这种情况。实际上,Java没有等同于不可变集合(只读事物只保证新对象不能更改,但是你仍然可以改变旧对象,因此,#34;只读#34;一个)。
Scala的Vector
由编译器和库高度优化,它是函数式编程中的基本数据类型。但是,它有局限性,并不适合并行编程。这些天,List
是比Seq
更好的选择,但习惯很难打破。
collection.Seq
是序列的一个很好的推广,所以如果编程到接口,你应该使用它。请注意,实际上有三个:collection.mutable.Seq
,collection.immutable.Seq
和GenSeq
,后者是"默认"导入范围。
还有ParSeq
和Seq
。后一种方法在可能的情况下并行运行,而前者是ParSeq
和{{1}}的父对象,对于代码的并行性并不重要是一种合适的推广。它们都是相对较新引入的,所以人们还没有多久使用它们。
答案 1 :(得分:59)
Seq是一个具有已定义元素顺序的Iterable。序列提供了用于索引的方法apply()
,范围从0到序列的长度。 Seq有许多子类,包括Queue,Range,List,Stack和LinkedList。
List是一个实现为不可变链表的Seq。它最适用于具有后进先出(LIFO)访问模式的情况。
以下是Scala FAQ:
中的完整集合类层次结构答案 2 :(得分:17)
在Scala中,List继承自Seq,但实现了Product;这是List的正确定义:
sealed abstract class List[+A] extends AbstractSeq[A] with Product with ...
[注意:the actual definition有点复杂,为了适应和利用Scala非常强大的集合框架。]
答案 3 :(得分:13)
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)
如果未指定容器类型,则基础数据结构默认为List
。
答案 4 :(得分:0)
正如@ daniel-c-sobral所说,List扩展了特征Seq,它是由scala.collection.immutable.$colon$colon
(或简称为::
)实现的抽象类,但是除了技术方面,请记住,大多数列表和我们使用的seq以Seq(1, 2, 3)
或List(1, 2, 3)
的形式初始化,都返回scala.collection.immutable.$colon$colon
,因此可以写:
var x: scala.collection.immutable.$colon$colon[Int] = null
x = Seq(1, 2, 3).asInstanceOf[scala.collection.immutable.$colon$colon[Int]]
x = List(1, 2, 3).asInstanceOf[scala.collection.immutable.$colon$colon[Int]]
因此,我认为最重要的不是您要公开的方法,例如,您可以使用List中的::
,而我发现List中的+:
是多余的默认情况下,Seq和我个人坚持使用Seq。