Yorumumu biraz genişleteceğim. 'Den gelen List[T]
veri yapısı, scala.collection.immutable
daha tamamen işlevsel bir programlama dilinde değişmez bir listenin çalıştığı şekilde çalışacak şekilde optimize edilmiştir. Çok hızlı ön sürelere sahip ve neredeyse tüm erişiminiz için kafa üzerinde çalışacağınız varsayılıyor.
Değişmez listeler, bağlantılı listelerini bir dizi "eksilerini" olarak modelledikleri için çok hızlı ön sürelere sahip olurlar. Hücre, tek bir değer ve sonraki hücreye (klasik tek bağlantılı liste stili) bir işaretçi tanımlar:
Cell [Value| -> Nil]
Bir listenin başına geçtiğinizde, mevcut listenin geri kalanının işaret edildiği şekilde, yalnızca tek bir yeni hücre oluşturursunuz:
Cell [NewValue| -> [Cell[Value| -> Nil]]
Liste değiştirilemediğinden, bunu gerçek bir kopyalama olmadan yapmak güvenlidir . Eski listenin değiştirilmesi ve yeni listenizdeki tüm değerlerin geçersiz olmasına neden olma tehlikesi yoktur. Ancak, uzlaşma olarak listenizin sonuna değişebilir bir işaretçi ekleme yeteneğini kaybedersiniz .
Bu, listeler üzerinde özyineli olarak çalışmaya çok iyi borç verir. Diyelim ki kendi sürümünüzü tanımladınız filter
:
def deleteIf[T](list : List[T])(f : T => Boolean): List[T] = list match {
case Nil => Nil
case (x::xs) => f(x) match {
case true => deleteIf(xs)(f)
case false => x :: deleteIf(xs)(f)
}
}
Bu, listenin başından özel olarak çalışan ve :: çıkarıcı ile desen eşleşmesinden yararlanan özyinelemeli bir işlevdir. Bu, Haskell gibi dillerde çokça gördüğünüz bir şey.
Gerçekten hızlı ekler istiyorsanız, Scala aralarından seçim yapabileceğiniz çok sayıda değiştirilebilir ve değişmez veri yapısı sunar. Değişken tarafta, içine bakabilirsiniz ListBuffer
. Alternatif olarak, Vector
gelen scala.collection.immutable
hızlı ekleme zamanı vardır.