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
8
A
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
È 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)
qual è il carico di prestazioni di tale codice? significato: ci vuole O (n) tempo? –
@StefanKunze, * cosa * richiede O (n) ora? Ovviamente, per esempio, la ricerca dell'indice sarà lineare. Ma questo è iterabile, dopotutto, non indicizzabile. –
la conversione iniziale in un iteratore? –