/ / scala .seq vs .toSeq - scala, collezioni, seq

scala .seq vs .toSeq - scala, collezioni, seq

Nella documentazione di Scala, le raccolte hanno entrambe.seq e un metodo .toSeq definiti su di essi. Qual è la differenza tra loro e perché ci sono entrambi? Non sono riuscito a capirlo leggendo la documentazione della collezione Scala.

risposte:

22 per risposta № 1

Supponiamo che io abbia una collezione parallela:

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

Ora operazioni come map su questa raccolta verrà eseguito in parallelo. Di solito è fantastico, dal momento che significa che le cose vengono eseguite più velocemente, ma a volte è davvero necessario eseguire una sorta di operazione con effetti collaterali sugli elementi, e quindi l'esecuzione in parallelo può causare problemi:

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

.seq consente di risolvere questo problema richiedendo l'esecuzione in sequenza delle operazioni (senza copiare il contenuto della raccolta):

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

In effetti si annulla .par. .toSeq non fornisce la stessa garanzia e in generale è utile solo nelle sottoclassi di GenTraversableOnce quello non è già SeqS.


1 per risposta № 2

L'esperimento con il sostituto mostra una differenza:

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)