353

我在许多示例中看​​到,有时使用 Seq,而其他时候使用 List ...

除了前者是 Scala 类型和 List 来自 Java 之外,有什么区别吗?

4

5 回答 5

469

在 Java 术语中,Scala 的Seq将是 Java 的List,Scala 的List将是 Java 的LinkedList

请注意,Seq是 a trait,它相当于 Java 的interface,但相当于新兴的防御者方法。ScalaList是一个抽象类,由Nil和扩展::,它们是List.

所以,JavaList是一个interface.,ScalaList是一个实现。

除此之外,ScalaList是不可变的,而LinkedList. 事实上,Java 没有不可变集合的等价物(只读的东西只保证新对象不能更改,但您仍然可以更改旧对象,因此,“只读”对象)。

ScalaList通过编译器和库进行了高度优化,它是函数式编程中的基本数据类型。但是,它有局限性,不足以进行并行编程。这些天来,Vector是比 更好的选择List,但习惯很难改掉。

Seq是序列的一个很好的概括,所以如果你编程到接口,你应该使用它。请注意,实际上有三个:collection.Seqcollection.mutable.Seqcollection.immutable.Seq,而后者是导入范围的“默认”。

还有GenSeqParSeq。后一种方法在可能的情况下并行运行,而前者是两者的父级SeqParSeq,当代码的并行性无关紧要时,它是一个合适的概括。它们都是相对较新引入的,因此人们还没有太多使用它们。

于 2012-06-02T23:48:11.797 回答
116

Seq是具有定义的元素顺序的 Iterable 。序列提供了一种apply()索引方法,范围从 0 到序列的长度。Seq 有许多子类,包括 Queue、Range、List、Stack 和 LinkedList。

List是作为不可变链表实现的 Seq 。它最适用于具有后进先出 (LIFO) 访问模式的情况。

这是Scala FAQ中完整的集合类层次结构:

在此处输入图像描述

于 2017-04-17T18:33:52.270 回答
35

SeqList实现的特征。

如果将容器定义为Seq,则可以使用任何实现Seqtrait 的容器。

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.

于 2017-06-27T18:54:54.133 回答
18

在 Scala 中,List 继承自 Seq,但实现了Product;这是List的正确定义:

sealed abstract class List[+A] extends AbstractSeq[A] with Product with ...

[注意:为了适应和利用 Scala 非常强大的集合框架实际的定义有点复杂。]

于 2012-06-02T23:21:52.563 回答
2

正如@daniel-c-sobral 所说,List 扩展了 trait 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 之前添加我认为与+:from Seq 多余的方法,并且我个人默认坚持使用 Seq。

于 2019-08-11T19:07:08.057 回答