Widziałem w wielu przykładach, że czasami używa się Seq, podczas gdy innym razem jest Lista ...
Czy jest jakaś różnica, poza tym, że poprzedni to Scala i Lista pochodząca z Javy?
źródło
Widziałem w wielu przykładach, że czasami używa się Seq, podczas gdy innym razem jest Lista ...
Czy jest jakaś różnica, poza tym, że poprzedni to Scala i Lista pochodząca z Javy?
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ą.
String
nie jest zbiorem, jest przykładem klas niezmiennych znanych programistom Java.UnsupportedOperationException
z tego powodu. Aby utworzyć niezmienną listę w Javie, użyj Collect.unmodifiableListSekwencyjny 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 :
źródło
Seq
jest cechą, która sięList
implementuje.Jeśli zdefiniujesz swój kontener jako
Seq
, możesz użyć dowolnego kontenera, który implementujeSeq
cechę.Zauważ, że
To tylko krótka ręka dla:
jeśli typ kontenera nie jest określony, domyślna struktura danych podstawowych to
List
.źródło
W Scali lista dziedziczy po Seq, ale implementuje produkt ; oto właściwa definicja Listy :
[Uwaga: rzeczywista definicja . Jest odrobinę nieco bardziej skomplikowane, aby dopasować się i korzystać z bardzo mocnym ramach kolekcji Scala]
źródło
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 formieSeq(1, 2, 3)
lubList(1, 2, 3)
które obie zwracająscala.collection.immutable.$colon$colon
, stąd można napisać: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.źródło