提问人:opensas 提问时间:6/3/2012 最后编辑:Jonikopensas 更新时间:2/8/2023 访问量:194851
Scala 中 Seq 和 List 之间的区别
Difference between a Seq and a List in Scala
答:
在 Scala 中,List 继承自 Seq,但实现了 Product;以下是 List 的正确定义:
sealed abstract class List[+A] extends AbstractSeq[A] with Product with ...
[注意:实际定义稍微复杂一些,以便适应和利用 Scala 非常强大的集合框架。
用 Java 术语来说,Scala 就是 Java 的,而 Scala 就是 Java 的。Seq
List
List
LinkedList
请注意,这是一个 ,它类似于 Java 的 ,但相当于新兴的防御方法。Scala 是一个抽象类,由 和 扩展,它们是 的具体实现。Seq
trait
interface
List
Nil
::
List
所以,Java 是一个,Scala 是一个实现。List
interface
List
除此之外,Scala 是不可变的,但 .事实上,Java 没有等同于不可变集合的东西(只读的东西只能保证新对象不能被更改,但你仍然可以更改旧对象,因此可以更改“只读”对象)。List
LinkedList
Scala 通过编译器和库进行了高度优化,它是函数式编程中的基本数据类型。但是,它有局限性,不足以进行并行编程。如今,是比 更好的选择,但习惯很难改掉。List
Vector
List
Seq
对于序列来说,这是一个很好的泛化,所以如果你编程到接口,你应该使用它。请注意,实际上有三个:、 和 ,后者是导入作用域的“默认”。collection.Seq
collection.mutable.Seq
collection.immutable.Seq
还有 和 .后一种方法在可能的情况下并行运行,而前者是 和 的父级,是 不关心代码并行性的合适泛化。它们都是相对较新的,所以人们不会经常使用它们。GenSeq
ParSeq
Seq
ParSeq
评论
String
UnsupportedOperationException
Seq 是具有定义元素顺序的 Iterable。序列提供了一种索引方法,范围从 0 到序列的长度。Seq 有许多子类,包括 Queue、Range、List、Stack 和 LinkedList。apply()
列表是作为不可变链表实现的序列。它最适合用于后进先出 (LIFO) 访问模式的情况。
以下是 Scala FAQ 中的完整集合类层次结构:
评论
prepend()
head()
append()
last()
Seq
是实现的特征。List
如果将容器定义为 ,则可以使用任何实现 trait 的容器。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
正如 @daniel-c-sobral 所说,List 扩展了特征 Seq,并且是由(或简称)实现的抽象类,但撇开技术细节不谈,请注意,我们使用的大多数列表和 seq 都是以 或 的形式初始化的,两者都返回,因此可以这样写:scala.collection.immutable.$colon$colon
::
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]]
因此,我认为唯一重要的是您要公开的方法,例如,在前面,您可以使用 from List 使用,我发现 from Seq 是多余的,我个人默认坚持使用 Seq。::
+:
评论