Scala'da Sıra ve Liste Arasındaki Fark


299

Birçok örnekte, bazen bir Seq kullanıldığını, diğer zamanlarda ise Liste olduğunu gördüm ...

Birincisinin Scala tipi olması ve Liste Java'dan gelmesi dışında herhangi bir fark var mı?

Yanıtlar:


408

Java terimleriyle Scala'nın SeqJava Listve Scala'nın ListJava olması gerekir LinkedList.

Not Seqbir olan traitJava'nın eşdeğerdir, interfaceancak eşdeğer olan savunucusu yöntemleri yukarı ve gelecek. Scala'nın Listgenişletilmiş Nilve ::somut uygulamaları olan soyut bir sınıftır List.

Java'nın Listbir olduğu yerde interface, Scala'nın Listbir uygulamasıdır.

Bunun ötesinde, Scala'nın Listdeğişmez bir durumu var, ki durum böyle değil LinkedList. Aslında, Java'nın değişmez koleksiyonlara eşdeğeri yoktur (salt okunur olan şey yalnızca yeni nesnenin değiştirilemeyeceğini garanti eder, ancak yine de eskisini ve dolayısıyla "salt okunur" olanı değiştirebilirsiniz).

Scala List, derleyici ve kütüphaneler tarafından oldukça optimize edilmiştir ve fonksiyonel programlamada temel bir veri türüdür. Ancak, sınırlamaları vardır ve paralel programlama için yetersizdir. Bu günlerde, Vectordaha iyi bir seçim List, ama alışkanlığı kırmak zor.

Seqdiziler için iyi bir genelleme olduğundan, arayüzlere program yapıyorsanız bunu kullanmalısınız. Not orada aslında üç tanesi olduğunu: collection.Seq, collection.mutable.Seqve collection.immutable.Seq, ve etki alanına dahil edilen, "varsayılan" dir ikincisi biridir.

Ayrıca GenSeqve var ParSeq. İkinci yöntemler mümkün olduğunda paralel çalışır, birincisi ise her ikisinin de ebeveynidir Seqve ParSeqbir kodun paralelliğinin önemi olmadığı zamanlar için uygun bir genellemedir. Her ikisi de nispeten yeni tanıtıldı, bu yüzden insanlar henüz çok fazla kullanmıyor.


3
RE "Java'nın değişmez koleksiyonlara eşdeğeri yoktur" , ancak Stringbir koleksiyon olmamasına rağmen , Java programcılarına tanıdık değişmez sınıflara bir örnektir.
huynhjl

15
@huynhjl Konunun yanında. Java'da olanlarla Scala'da bulunanlar arasında paralellikler çiziyordum ve Java'da değişebilir / değişmez koleksiyonlar kavramı yok.
Daniel C. Sobral

2
Java aslında değişmez koleksiyonlara eşdeğerdir. Onun değil 'iyi reklamı' ama onun orada ve jenerikler ağır kullandığınızda UnsupportedOperationExceptionbu nedenle bazı vurmak muhtemeldir . Java'da değişmez bir liste oluşturmak için Collections.unmodifiableList () yöntemini kullanırsınız ve benzer şekilde Setler, Haritalar vb. İçin
jbx

27
@jbx Doğru değil. Bu yöntemleri kullanırsanız, bir şey değiştirmek yöntemleri istisnalar atmak, ancak bir edecek bir nesne olsun değişmez nesne. Orijinal nesne değiştirilemez nesne oluşturulduktan sonra değiştirilirse değiştirilemez nesne bunu yansıtacaktır. Yani, değiştirilemez, evet, değişmez, hayır.
Daniel C. Sobral

3
@jbx Alma yöntemi, aldığı koleksiyona bir referans tutamaz ve asla değişmeyeceğini varsayar ve standart Java kitaplığında bunu garanti edecek bir tür yoktur - bu değişmezliktir. Yani, örneğin, bu alma yöntemi iplik güvenliğini garanti edemez. Ve bu, değişmezliğin sağladığı kalıcı özelliklere bile dokunmuyor. Bütün bunlar olmadan "eşdeğer" olarak adlandırılamaz.
Daniel C. Sobral

82

Bir Sıra , tanımlanmış bir öğe sırasına sahip bir Tekrarlanabilirdir. Diziler apply(), 0 ile dizinin uzunluğu arasında değişen bir indeksleme yöntemi sağlar. Seq, Kuyruk, Aralık, Liste, Yığın ve LinkedList gibi birçok alt sınıfa sahiptir.

Bir Liste değişmez bir bağlantılı liste olarak uygulanan bir Seq olduğunu. En iyi son giren ilk çıkar (LIFO) erişim desenleri olan durumlarda kullanılır.

İşte Scala SSS bölümündeki tüm koleksiyon sınıfı hiyerarşisi :

resim açıklamasını buraya girin


2
Array (ve ArrayBuffer) nerede? Bu tür bir itiraz değil
Peter Krauss

23

SeqListuygulayan bir özelliktir .

Kapsayıcınızı olarak tanımlarsanız, özelliği Sequygulayan herhangi bir kap kullanabilirsiniz 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

Bunu not et

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

Kısa bir el için:

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

kap türü belirtilmezse, temel alınan veri yapısı varsayılan olarak kullanılır List.


18

Scala'da bir Liste, Seq'tan miras alır, ancak Ürünü uygular ; Burada doğru tanımıdır Listesi :

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

[Not: Scala'nın çok güçlü toplama çerçevesine uymak ve yararlanmak için gerçek tanım biraz daha karmaşıktır.]


0

@ Daniel c-Sobral belirtildiği gibi, listesi özelliği Seq uzanır ve uyguladığı soyut sınıftır scala.collection.immutable.$colon$colon(veya ::listeleri ve KCS çoğu bu formunda başlatılır kullanmak olduğu, zihin kısa), ama bir kenara teknik bir Seq(1, 2, 3)ya da List(1, 2, 3)bunların her ikisi de dönüş scala.collection.immutable.$colon$colon, böylece kişi yazabilir:

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]]

Sonuç olarak, önemli olan tek şeyden daha fazlasını ortaya çıkarmak için yöntemler olduğunu iddia ediyorum, örneğin, Seq'den ::fazla bulduğum Listeden kullanabileceğinizi +:ve varsayılan olarak kişisel olarak Seq'e bağlı olduğum listeyi kullanabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.