Differenza tra un Seq e una lista in Scala

Ho visto in molti esempi che a volte viene usato un Seq, mentre altre volte è l’Elenco …

C’è qualche differenza, oltre a quella precedente che è un tipo Scala e la lista proveniente da Java?

In termini Java, Seq di Scala sarebbe la List di Java, e la List di Scala sarebbe la LinkedList di Java.

Nota che Seq è un trait , che è equivalente all’interfaccia di Java, ma con l’equivalente di metodi di difesa emergenti. Scala’s List è una class astratta estesa da Nil e :: , che sono le implementazioni concrete di List .

Quindi, laddove Java’s List è interface , Scala’s List è un’implementazione.

Oltre a ciò, Scala’s List è immutabile, il che non è il caso di LinkedList . Infatti, Java non ha equivalenti a collezioni immutabili (la sola cosa di sola lettura garantisce che il nuovo object non può essere cambiato, ma è comunque ansible modificare quello vecchio e, quindi, quello “di sola lettura”).

Scala’s List è altamente ottimizzato dal compilatore e dalle librerie ed è un tipo di dati fondamentale nella programmazione funzionale. Tuttavia, ha delle limitazioni ed è inadeguato per la programmazione parallela. In questi giorni, Vector è una scelta migliore rispetto a List , ma l’abitudine è difficile da rompere.

Seq è una buona generalizzazione per le sequenze, quindi se programmi alle interfacce, dovresti usarlo. Si noti che ce ne sono in realtà tre: collection.Seq , collection.mutable.Seq e collection.immutable.Seq , ed è quest’ultimo che è il “default” importato nell’ambito.

C’è anche GenSeq e ParSeq . Questi ultimi metodi si eseguono in parallelo ove ansible, mentre il primo è genitore sia di Seq che di ParSeq , essendo una generalizzazione adatta per quando il parallelismo di un codice non ha importanza. Sono entrambi relativamente nuovi, quindi la gente non li usa ancora molto.

Un Seq è un Iterable che ha un ordine definito di elementi. Le sequenze forniscono un metodo apply() per l’indicizzazione, che va da 0 fino alla lunghezza della sequenza. Seq ha molte sottoclassi tra cui coda, intervallo, elenco, stack e lista collegata.

Un elenco è un Seq implementato come elenco collegato immutabile. È preferibile utilizzare in caso di modelli di accesso LIFO (last-in first-out).

Ecco la gerarchia completa della class di raccolta dalle FAQ di Scala :

inserisci la descrizione dell'immagine qui

In Scala, un elenco eredita da Seq, ma implementa il prodotto ; ecco la corretta definizione di List :

 sealed abstract class List[+A] extends AbstractSeq[A] with Product with ... 

[Nota: la definizione attuale è un po ‘più complessa, per adattarsi e utilizzare il framework di raccolta molto potente di Scala.]

Seq è un tratto che l’ List implementa.

Se si definisce il contenitore come Seq , è ansible utilizzare qualsiasi contenitore che implementa il tratto Seq .

 scala> def sumUp(s: Seq[Int]): Int = { s.sum } sumUp: (s: Seq[Int])Int scala> sumUp(List(1,2,3)) res41: Int = 6 scala> sumUp(Vector(1,2,3)) res42: Int = 6 scala> sumUp(Seq(1,2,3)) res44: Int = 6 

Nota che

 scala> val a = Seq(1,2,3) a: Seq[Int] = List(1, 2, 3) 

È solo una breve mano per:

 scala> val a: Seq[Int] = List(1,2,3) a: Seq[Int] = List(1, 2, 3) 

se il tipo di contenitore non è specificato, la struttura di dati sottostante assume come valore predefinito List .