मैं अपनी टिप्पणी को थोड़ा विस्तार दूंगा। List[T]
डेटा संरचना, से scala.collection.immutable
एक अधिक विशुद्ध रूप से कार्यात्मक प्रोग्रामिंग भाषा पर काम चल रहा अपरिवर्तनीय सूची तरह से काम करने के लिए अनुकूलित है। यह बहुत तेजी से किया गया है पहले जोड़ें बार, और यह माना जाता है कि आप अपनी पहुंच के लगभग सभी के लिए सिर पर काम करेंगे।
अपरिवर्तनीय सूचियाँ इस तथ्य के कारण बहुत तेज़ गति से प्राप्त होती हैं कि वे "लिप्त कोशिकाओं" की एक श्रृंखला के रूप में अपनी जुड़ी हुई सूचियों को मॉडल करती हैं। सेल एक एकल मान को परिभाषित करता है, और अगली सेल को एक सूचक (क्लासिक एकल-लिंक्ड-सूची शैली):
Cell [Value| -> Nil]
जब आप किसी सूची में जाते हैं, तो आप वास्तव में केवल एक नया सेल बना रहे होते हैं, शेष मौजूदा सूची के साथ:
Cell [NewValue| -> [Cell[Value| -> Nil]]
क्योंकि सूची अपरिवर्तनीय है, आप बिना किसी वास्तविक प्रतिलिपि के ऐसा करने के लिए सुरक्षित हैं । पुरानी सूची के बदलने और आपकी नई सूची के सभी मूल्यों को अमान्य बनाने का कोई खतरा नहीं है। हालाँकि, आप एक समझौता के रूप में अपनी सूची के अंत तक एक परस्पर सूचक रखने की क्षमता खो देते हैं ।
यह सूचियों पर पुनरावर्ती रूप से काम करने के लिए बहुत अच्छी तरह से उधार देता है। मान लीजिए कि आपने अपना स्वयं का संस्करण परिभाषित किया है 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)
}
}
यह एक पुनरावर्ती कार्य है जो विशेष रूप से सूची के प्रमुख से काम करता है, और :: चिमटा के माध्यम से मिलान पैटर्न का लाभ उठाता है। यह कुछ ऐसा है जिसे आप हास्केल जैसी भाषाओं में देखते हैं।
यदि आप वास्तव में तेजी से अपील चाहते हैं, तो स्काला चुनने के लिए बहुत से उत्परिवर्तनीय और अपरिवर्तनीय डेटा संरचनाएं प्रदान करता है। परिवर्तनशील पक्ष पर, आप गौर कर सकते हैं ListBuffer
। वैकल्पिक रूप से, Vector
से scala.collection.immutable
एक तेजी से संलग्न समय है।