Scala.seq vs .toSeq

В документации Scala коллекции имеют как .seq, так и метод .toSeq, определенные на них. В чем разница между ними и почему они оба существуют? Я не смог понять это из чтения документации коллекции Scala.

Ответ 1

Предположим, что у меня есть параллельная коллекция:

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 не предоставляет такую ​​же гарантию и вообще полезен только для подклассов GenTraversableOnce, которые уже не являются Seq s.

Ответ 2

Эксперимент в реплике показывает одно отличие:

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)