2014-10-10 9 views
11

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

ответ

20

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

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.

+10

Чтобы подвести итог, вы можете думать о '.toSeq', как сокращенные' .toSequence' и '.seq' как' .toSequential'. –

1

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

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) 
+0

OP говорит, что они уже прочитали документы API, где четко указано различие в типе возврата, поэтому я не уверен, что это будет полезно. –

Смежные вопросы