Yanıtlar:
Java terimleriyle Scala'nın Seq
Java List
ve Scala'nın List
Java olması gerekir LinkedList
.
Not Seq
bir olan trait
Java'nın eşdeğerdir, interface
ancak eşdeğer olan savunucusu yöntemleri yukarı ve gelecek. Scala'nın List
genişletilmiş Nil
ve ::
somut uygulamaları olan soyut bir sınıftır List
.
Java'nın List
bir olduğu yerde interface
, Scala'nın List
bir uygulamasıdır.
Bunun ötesinde, Scala'nın List
değ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, Vector
daha iyi bir seçim List
, ama alışkanlığı kırmak zor.
Seq
diziler 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.Seq
ve collection.immutable.Seq
, ve etki alanına dahil edilen, "varsayılan" dir ikincisi biridir.
Ayrıca GenSeq
ve var ParSeq
. İkinci yöntemler mümkün olduğunda paralel çalışır, birincisi ise her ikisinin de ebeveynidir Seq
ve ParSeq
bir 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.
UnsupportedOperationException
bu 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
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 :
Seq
List
uygulayan bir özelliktir .
Kapsayıcınızı olarak tanımlarsanız, özelliği Seq
uygulayan 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
.
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.]
@ 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.
String
bir koleksiyon olmamasına rağmen , Java programcılarına tanıdık değişmez sınıflara bir örnektir.