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 № 1Supponiamo 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à Seq
S.
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)