जवाबों:
जावा के संदर्भ में, स्काला Seq
जावा का होगा List
, और स्काला List
जावा का होगा LinkedList
।
ध्यान दें कि Seq
एक है trait
, जो जावा के बराबर है interface
, लेकिन ऊपर और आने वाले रक्षक तरीकों के बराबर है। स्काला List
एक अमूर्त वर्ग है जो कि विस्तारित है Nil
और ::
, जिसके ठोस कार्यान्वयन हैं List
।
तो, जहां जावा List
एक है interface
, स्काला का List
कार्यान्वयन है।
इसके अलावा, स्काला List
अपरिवर्तनीय है, जो कि मामला नहीं है LinkedList
। वास्तव में, जावा के पास अपरिवर्तनीय संग्रह के बराबर नहीं है (केवल एक चीज जो केवल नई वस्तु की गारंटी देती है उसे बदला नहीं जा सकता है, लेकिन आप अभी भी पुराने को बदल सकते हैं, और इसलिए, "केवल पढ़ने के लिए" एक)।
Scala's List
को कंपाइलर और लाइब्रेरीज़ द्वारा अत्यधिक अनुकूलित किया गया है, और यह कार्यात्मक प्रोग्रामिंग में एक मौलिक डेटा प्रकार है। हालाँकि, इसकी सीमाएँ हैं और यह समानांतर प्रोग्रामिंग के लिए अपर्याप्त है। इन दिनों, Vector
से बेहतर विकल्प है List
, लेकिन आदत को तोड़ना मुश्किल है।
Seq
अनुक्रमों के लिए एक अच्छा सामान्यीकरण है, इसलिए यदि आप इंटरफेस के लिए प्रोग्राम करते हैं, तो आपको इसका उपयोग करना चाहिए। नोट वहाँ वास्तव में तीन उनमें से हैं कि: collection.Seq
, collection.mutable.Seq
और collection.immutable.Seq
, और यह बाद के एक है कि "डिफ़ॉल्ट" दायरे में आयात किया है।
वहाँ भी है GenSeq
और ParSeq
। बाद के तरीके समानांतर में चलते हैं जहां संभव है, जबकि पूर्व दोनों के लिए माता-पिता है Seq
और ParSeq
जब एक कोड के समानांतरवाद के लिए एक उपयुक्त सामान्यीकरण नहीं होता है। वे दोनों अपेक्षाकृत नए हैं, इसलिए लोग उन्हें अभी तक उपयोग नहीं करते हैं।
UnsupportedOperationException
इस वजह से कुछ हिट होने की संभावना है । जावा में अपरिवर्तनीय सूची) बनाने के लिए आप Collections.unmodifiableList (का उपयोग करें और इसी तरह देखते हैं सेट के लिए अन्य तरीकों, नक्शे आदि docs.oracle.com/javase/6/docs/api/java/util/...
एक Seq एक Iterable तत्वों का एक परिभाषित आदेश किया है। अनुक्रम apply()
अनुक्रमण के लिए एक विधि प्रदान करते हैं , 0 से लेकर अनुक्रम की लंबाई तक। Seq में क्यू, रेंज, लिस्ट, स्टैक और लिंक्डलिस्ट सहित कई उपवर्ग हैं।
एक सूची एक Seq है जिसे एक अपरिवर्तनीय लिंक्ड सूची के रूप में लागू किया जाता है। पिछले-इन-आउट (LIFO) एक्सेस पैटर्न वाले मामलों में इसका सबसे अच्छा उपयोग किया जाता है।
यहाँ स्केल संग्रह से पूरा संग्रह वर्ग पदानुक्रम है :
Seq
एक गुण है जो List
लागू करता है।
यदि आप अपने कंटेनर को इस रूप में परिभाषित करते हैं Seq
, तो आप किसी भी कंटेनर का उपयोग कर सकते हैं जो 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
ध्यान दें कि
scala> val a = Seq(1,2,3)
a: Seq[Int] = List(1, 2, 3)
के लिए सिर्फ एक छोटा हाथ है:
scala> val a: Seq[Int] = List(1,2,3)
a: Seq[Int] = List(1, 2, 3)
यदि कंटेनर प्रकार निर्दिष्ट नहीं है, तो अंतर्निहित डेटा संरचना डिफ़ॉल्ट हो जाती है List
।
स्काला में, एक सूची Seq से विरासत में मिलती है, लेकिन उत्पाद लागू करता है ; यहाँ सूची की उचित परिभाषा है :
sealed abstract class List[+A] extends AbstractSeq[A] with Product with ...
[नोट: वास्तविक परिभाषा । एक बालक के साथ और मेकअप स्काला के बहुत शक्तिशाली संग्रह ढांचे के उपयोग में फिट करने के लिए और अधिक जटिल सा, क्रम में है]
जैसा कि @ daniel-c-sobral ने कहा, सूची गुण Seq का विस्तार करती है और scala.collection.immutable.$colon$colon
(या ::
संक्षेप के लिए) द्वारा कार्यान्वित एक अमूर्त वर्ग है , लेकिन एक तरफ तकनीकी, यह ध्यान में रखते हुए कि हम जिन सूचियों और seq का उपयोग करते हैं उनमें से अधिकांश को प्रारंभिक रूप में Seq(1, 2, 3)
या List(1, 2, 3)
जिसे दोनों वापस करते हैं scala.collection.immutable.$colon$colon
, इसलिए कोई लिख सकता है:
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]]
नतीजतन, मैं केवल एक ही बात पर बहस करूंगा कि वे मामले हैं, जिन्हें आप उजागर करना चाहते हैं, उदाहरण के लिए आप ::
जिस सूची का उपयोग कर सकते हैं , उसे मैं +:
Seq से निरर्थक पाता हूं और मैं व्यक्तिगत रूप से डिफ़ॉल्ट रूप से Seq से चिपक जाता हूं।
String
यह संग्रह नहीं है, यह जावा अक्षर से परिचित अपरिवर्तनीय वर्गों का एक उदाहरण है।