2013-10-23 17 views
8

Come implementare Scala equivalente a Java Iterable<T> e C# IEnumerable<T>? Fondamentalmente, voglio che la mia collezione sia mappabile, filtrabile, ecc. Quali tratti dovrebbe estendere la classe di raccolta e ci sono modi semplici (qualcosa come yield return e yield break in C#) per creare l'enumeratore?Implementazione Iterable

risposta

13

Implementare il tratto Iterable. Tutto ciò che serve è il metodo iterator. Tutti gli altri metodi (map, filter, ecc.) Sono gratuiti.

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

qual è il carico di prestazioni di tale codice? significato: ci vuole O (n) tempo? –

+0

@StefanKunze, * cosa * richiede O (n) ora? Ovviamente, per esempio, la ricerca dell'indice sarà lineare. Ma questo è iterabile, dopotutto, non indicizzabile. –

+0

la conversione iniziale in un iteratore? –

0

È possibile utilizzare il tratto scala.collection.Iterable o la sua versione immutabile che è piuttosto completa e potente. Spero che ti possa aiutare.

0

Per quanto riguarda gli enumeratori, c'è censimento nel Scala ma utilizzando sigillato tratti + classi derivate sembra essere più flessibile, ad esempio:

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) 

È possibile utilizzare questi oggetti senza alcuna struttura interna così , se non ti interessa mapparli a qualsiasi cosa eccetto le loro rappresentazioni di stringa:

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) 
Problemi correlati