Odpowiedzi:
Mówiąc językiem Java, Scala należałaby do Seq
Javy List
, a Scala należałaby do List
Javy LinkedList
.
Zauważ, że Seq
jest trait
to odpowiednik Javy interface
, ale z odpowiednimi metodami obrońcy. Scala List
to klasa abstrakcyjna, która jest rozszerzana przez Nil
i ::
, które są konkretnymi implementacjami List
.
Tak więc, tam gdzie Java List
jest interface
, Scala List
jest implementacją.
Poza tym Scala's List
jest niezmienny, co nie jest prawdą LinkedList
. W rzeczywistości Java nie ma odpowiednika niezmiennych kolekcji (tylko do odczytu gwarantuje tylko, że nowego obiektu nie można zmienić, ale nadal można zmienić stary, a zatem „tylko do odczytu”).
Scala List
jest wysoce zoptymalizowany przez kompilator i biblioteki i jest podstawowym typem danych w programowaniu funkcjonalnym. Ma jednak ograniczenia i nie nadaje się do programowania równoległego. Te dni Vector
to lepszy wybór List
, ale nawyk jest trudny do przełamania.
Seq
jest dobrym uogólnieniem dla sekwencji, więc jeśli programujesz interfejsy, powinieneś tego użyć. Należy pamiętać, że tak naprawdę są trzy z nich: collection.Seq
, collection.mutable.Seq
i collection.immutable.Seq
, i to jest ten ostatni, który jest „default” importowane do zakresu.
Jest też GenSeq
i ParSeq
. Te ostatnie metody działają równolegle tam, gdzie to możliwe, podczas gdy te pierwsze są nadrzędne dla obu Seq
i ParSeq
są odpowiednim uogólnieniem, gdy równoległość kodu nie ma znaczenia. Oba są stosunkowo nowo wprowadzone, więc ludzie jeszcze ich nie używają.
UnsupportedOperationException
z tego powodu. Aby utworzyć niezmienną listę w Javie, użyj Collect.unmodifiableList
Sekwencyjny jest iterowalny który posiada określoną kolejność elementów. Sekwencje zapewniają metodę apply()
indeksowania, od 0 do długości sekwencji. Seq ma wiele podklas, w tym Kolejkę, Zakres, Listę, Stos i LinkedList.
Lista jest sekwencyjny, który jest zaimplementowany jako niezmiennej listy powiązanej. Najlepiej stosować go w przypadkach z wzorcami dostępu „ostatni na wejściu” (LIFO).
Oto pełna hierarchia klas kolekcji z FAQ Scala :
Seq
jest cechą, która się List
implementuje.
Jeśli zdefiniujesz swój kontener jako Seq
, możesz użyć dowolnego kontenera, który implementuje Seq
cechę.
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
Zauważ, że
scala> val a = Seq(1,2,3)
a: Seq[Int] = List(1, 2, 3)
To tylko krótka ręka dla:
scala> val a: Seq[Int] = List(1,2,3)
a: Seq[Int] = List(1, 2, 3)
jeśli typ kontenera nie jest określony, domyślna struktura danych podstawowych to List
.
W Scali lista dziedziczy po Seq, ale implementuje produkt ; oto właściwa definicja Listy :
sealed abstract class List[+A] extends AbstractSeq[A] with Product with ...
[Uwaga: rzeczywista definicja . Jest odrobinę nieco bardziej skomplikowane, aby dopasować się i korzystać z bardzo mocnym ramach kolekcji Scala]
Jak powiedział @ daniel-c-sobral, List rozszerza cechę Seq i jest klasą abstrakcyjną zaimplementowaną przez scala.collection.immutable.$colon$colon
(lub ::
w skrócie), ale pomijając kwestie techniczne, pamiętaj, że większość używanych przez nas list i sekwencji jest inicjowana w formie Seq(1, 2, 3)
lub List(1, 2, 3)
które obie zwracają scala.collection.immutable.$colon$colon
, stąd można napisać:
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]]
W związku z tym argumentowałbym, że jedyne, co się liczy, to metody, które chcesz ujawnić, na przykład, aby przygotować się do użycia ::
z Listy, które uważam za zbędne z +:
Seq i osobiście domyślnie trzymam się Seq.
String
nie jest zbiorem, jest przykładem klas niezmiennych znanych programistom Java.