Risposte:
In termini Java, Scala Seq
sarebbe Java List
e Scala List
sarebbe Java LinkedList
.
Nota che Seq
è un trait
, che è equivalente a quello di Java interface
, ma con l'equivalente di metodi difensivi emergenti. Scala List
è una classe astratta che viene estesa da Nil
e ::
, che sono le implementazioni concrete di List
.
Quindi, dove Java List
è un interface
, Scala List
è un'implementazione.
Oltre a ciò, Scala List
è immutabile, il che non è il caso di LinkedList
. In effetti, Java non ha equivalenti a raccolte immutabili (la sola lettura garantisce solo che il nuovo oggetto non può essere modificato, ma è comunque possibile cambiare quello vecchio e, quindi, quello "sola lettura").
Scala List
è altamente ottimizzato da compilatore e librerie ed è un tipo di dati fondamentale nella programmazione funzionale. Tuttavia, presenta delle limitazioni ed è inadeguato per la programmazione parallela. In questi giorni, Vector
è una scelta migliore di List
, ma l'abitudine è difficile da rompere.
Seq
è una buona generalizzazione per le sequenze, quindi se programmate interfacce, dovreste usarle. Nota che ci sono in realtà tre di loro: collection.Seq
, collection.mutable.Seq
e collection.immutable.Seq
, ed è il secondo quello che è il "default" importato in ambito.
C'è anche GenSeq
e ParSeq
. Questi ultimi metodi funzionano in parallelo ove possibile, mentre il primo è genitore di entrambi Seq
e ParSeq
, essendo una generalizzazione adatta per quando il parallelismo di un codice non ha importanza. Sono entrambi introdotti relativamente di recente, quindi le persone non li usano ancora molto.
UnsupportedOperationException
causa di questo. Per creare un elenco immutabile in Java usi il Collections.unmodifiableList () e allo stesso modo ci sono altri metodi per set, mappe ecc. Docs.oracle.com/javase/6/docs/api/java/util/…
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 LinkedList.
Un elenco è un Seq implementato come un elenco collegato immutabile. È meglio utilizzato nei casi con schemi di accesso last-in first-out (LIFO).
Ecco la gerarchia completa della classe di raccolta dalle FAQ di Scala :
Seq
è un tratto che List
implementa.
Se si definisce il contenitore come Seq
, è possibile utilizzare qualsiasi contenitore che implementa Seq
tratto.
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 scorciatoia per:
scala> val a: Seq[Int] = List(1,2,3)
a: Seq[Int] = List(1, 2, 3)
se il tipo di contenitore non è specificato, per impostazione predefinita la struttura dati sottostante List
.
In Scala, un Elenco eredita da Seq, ma implementa Prodotto ; ecco la definizione corretta di Elenco :
sealed abstract class List[+A] extends AbstractSeq[A] with Product with ...
[Nota: la definizione attuale è un po 'più complessa, al fine di adattarsi e utilizzare il potente framework di raccolta di Scala.]
Come diceva @ daniel-c-sobral, List estende il tratto Seq ed è una classe astratta implementata da scala.collection.immutable.$colon$colon
(o ::
in breve), ma a parte i tecnicismi, tieni presente che la maggior parte degli elenchi e dei seq che usiamo sono inizializzati nella forma di Seq(1, 2, 3)
o List(1, 2, 3)
che entrambi restituiscono scala.collection.immutable.$colon$colon
, quindi si può scrivere:
var x: scala.collection.immutable.$colon$colon[Int] = null
x = Seq(1, 2, 3).asInstanceOf[scala.collection.immutable.$colon$colon[Int]]
x = List(1, 2, 3).asInstanceOf[scala.collection.immutable.$colon$colon[Int]]
Di conseguenza, direi che l'unica cosa che conta sono i metodi che vuoi esporre, ad esempio per anteporre puoi usare ::
da Elenco che trovo ridondante con +:
da Seq e mi attengo personalmente a Seq per impostazione predefinita.
String
non sia una raccolta, è un esempio di classi immutabili familiari ai programmatori Java.