scala .seq vs .toSeq

17

在Scala文档中,集合类同时定义了.seq和.toSeq方法。它们之间有什么区别,为什么都要存在呢?我从Scala集合类的文档中无法理解出来。

2个回答

26

假设我有一个并行集合:

val myParList = List(1, 2, 3, 4).par

现在对这个集合进行map等操作将会并行运行。通常情况下这很棒,因为它意味着任务可以更快完成,但有时你确实需要在元素上执行某种副作用操作,而并行运行可能会导致问题:

scala> myParList.foreach(println)
1
4
3
2

.seq 允许您通过要求操作按顺序运行(而不复制集合的内容)来解决此问题:

scala> myParList.seq.foreach(println)
1
2
3
4

实际上它只是撤销了.par.toSeq不能提供同样的保证,在一般情况下,它只对那些不是已经是SeqGenTraversableOnce的子类有用。


14
总之,你可以把.toSeq看作是对.toSequence的缩写,把.seq看作是.toSequential的简写。 - Travis Brown

2

在 repl 中进行实验显示一个差异:

scala> val l = List(1,2,3)
l: List[Int] = List(1, 2, 3)

scala> l.seq
res2: scala.collection.immutable.LinearSeq[Int] = List(1, 2, 3)

scala> l.toSeq
res3: scala.collection.immutable.Seq[Int] = List(1, 2, 3)

OP说他们已经阅读了API文档,其中返回类型的差异已经清楚地指出,所以我不确定这会有帮助。 - Travis Brown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接