В документации Scala коллекции имеют как .seq, так и метод .toSeq, определенные на них. В чем разница между ними и почему они оба существуют? Я не смог понять это из чтения документации коллекции Scala.
Scala.seq vs .toSeq
Ответ 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)