在Scala文档中,集合类同时定义了.seq和.toSeq方法。它们之间有什么区别,为什么都要存在呢?我从Scala集合类的文档中无法理解出来。
在Scala文档中,集合类同时定义了.seq和.toSeq方法。它们之间有什么区别,为什么都要存在呢?我从Scala集合类的文档中无法理解出来。
假设我有一个并行集合:
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
不能提供同样的保证,在一般情况下,它只对那些不是已经是Seq
的GenTraversableOnce
的子类有用。
在 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)
.toSeq
看作是对.toSequence
的缩写,把.seq
看作是.toSequential
的简写。 - Travis Brown