2013-10-23 11 views
8

Wie Scala zu implementieren Java Iterable<T> und C# IEnumerable<T>? Grundsätzlich möchte ich, dass meine Sammlung abbildbar, filterbar usw. ist. Welche Eigenschaften sollte die Collection-Klasse erweitern und gibt es einfache Möglichkeiten (etwas wie und yield break in C#), um Enumerator zu erstellen?Implementieren Iterable

Antwort

13

Implementieren Sie die Iterable Eigenschaft. Alles, was benötigt wird, ist die iterator Methode. Alle anderen Methoden (map, filter, usw.) sind kostenlos.

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

Was ist die Leistungslast dieses Codes? Bedeutung: braucht es O (n) Zeit? –

+0

@StefanKunze, * was * braucht O (n) Zeit? Natürlich wird das Index-Lookup linear sein. Aber das ist iterabel, schließlich nicht indexierbar. –

+0

die anfängliche Konvertierung in einen Iterator? –

0

Sie können scala.collection.Iterable Eigenschaft oder seine unveränderliche Version verwenden, die ziemlich umfassend und leistungsfähig sind. Hoffe das wird helfen.

0

In Bezug auf den Aufzählungen gibt es Enumeration in Scala, aber unter Verwendung von versiegelten Zügen + abgeleiteten Klassen scheint flexibler zu sein, zum Beispiel:

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) 

Sie diese Objekte ohne interne Struktur verwenden kann, als auch , wenn es nicht wichtig ist, sie mit Ausnahme ihrer String-Darstellungen zuzuordnen:

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)