2013-10-23 44 views
8

जावा Iterable<T> और सी # IEnumerable<T> के बराबर स्कैला को कैसे कार्यान्वित करें? असल में, मैं चाहता हूं कि मेरा संग्रह मैप करने योग्य, फिल्टर करने योग्य आदि हो। संग्रह वर्ग को किस प्रकार के गुणों का विस्तार करना चाहिए और क्या yield return और yield break सी # में गणना करने के लिए आसान हैं?लागू करने योग्य Iterable

उत्तर

13

Iterable विशेषता लागू करें। यह आवश्यक है कि iterator विधि है। अन्य सभी विधियों (map, filter, आदि) मुफ्त में आते हैं।

class MyIterable[T](xs: Vector[T]) extends Iterable[T] { 
    override def iterator = xs.iterator 
} 

val a = new MyIterable(Vector(1,2,3)) 
a.map(_+1) // res0: Iterable[Int] = List(2, 3, 4) 
a.filter(_%2==1) // res1: Iterable[Int] = List(1, 3) 
+0

उस कोड का प्रदर्शन बोझ क्या है? अर्थ: क्या यह ओ (एन) समय लेता है? –

+0

@StefanKunze, * क्या * ओ (एन) समय लेता है? बेशक, कहें, इंडेक्स लुकअप रैखिक होगा। लेकिन यह सब के बाद, सूचकांक नहीं है। –

+0

एक पुनरावर्तक के लिए प्रारंभिक रूपांतरण? –

0

आप scala.collection.Iterable विशेषता या इसके अपरिवर्तनीय संस्करण का उपयोग कर सकते हैं जो बहुत व्यापक और शक्तिशाली हैं। उम्मीद है कि मदद करेगा।

0

प्रगणक के बारे में, वहाँ स्काला में गणन है, लेकिन सील का उपयोग लक्षण + व्युत्पन्न वर्ग और अधिक लचीला हो रहा है, उदाहरण के लिए:

sealed trait MyEnum { 
    lazy val value = 0 
} 
case object MyEnumA extends MyEnum { 
    override lazy val value = 1 
} 
case object MyEnumB extends MyEnum { 
    override lazy val value = 2 
} 

scala> val a = MyEnumB 
a: MyEnumB.type = MyEnumB 

scala> a.value 
res24: Int = 2 

scala> val l = List(MyEnumA,MyEnumB) 
l: List[Product with Serializable with MyEnum] = List(MyEnumA, MyEnumB) 

scala> l.map(_.value) 
res29: List[Int] = List(1, 2) 

साथ ही आप किसी भी आंतरिक संरचना के बिना इन वस्तुओं का उपयोग कर सकते , यदि आप उनके स्ट्रिंग प्रस्तुतियों को छोड़कर उन्हें किसी भी चीज़ पर मैप करने की परवाह नहीं करते हैं:

sealed trait MyEnum 
case object MyEnumA extends MyEnum 
case object MyEnumB extends MyEnum 

scala> val a = MyEnumA 
a: MyEnumA.type = MyEnumA 

scala> a.toString 
res21: String = MyEnumA 

scala> val l = List(MyEnumA,MyEnumB) 
l: List[Product with Serializable with MyEnum] = List(MyEnumA, MyEnumB) 

scala> l.map(_.toString) 
res30: List[String] = List(MyEnumA, MyEnumB) 
संबंधित मुद्दे