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)
Problemi correlati
- 1. Implementazione dell'interfaccia Java Iterable <E>
- 2. "yield from iterable" vs "return iter (iterable)"
- 3. scala Iterable # map vs. Iterable # flatMap
- 4. Riduzione Iterable [O [A, B]] su [A, Iterable [B]]
- 5. Come posso convertire Java Iterable in Scala Iterable?
- 6. Scala Iterable Memory Leaks
- 7. Python: errore Int iterable
- 8. Raccolta su Iterable
- 9. Combinazione dell'opzione Scala [Iterable [_]]
- 10. L'oggetto 'AnonymousUser' non è iterable
- 11. MediaDefiningClass L'oggetto non è iterable?
- 12. Come posso implementare l'interfaccia Iterable?
- 13. L'oggetto int non è iterable?
- 14. Conversione da Iterable a Array
- 15. Converti array Java in Iterable
- 16. Scala: Raggruppa un Iterable in Iterable of Iterables secondo un predicato
- 17. L'oggetto Django Rest Framework non è iterable?
- 18. Come implementare Iterable <E>
- 19. Funzioni di test iterable restituendo in python
- 20. Scala: partecipare a un iterable di stringhe
- 21. imap_unordered() riaggancia se iterable genera un errore
- 22. Perché non c'è un'interfaccia "Iterable" nell'STL?
- 23. Rendi la classe iterable rispettando l'ereditarietà
- 24. Come creare un TreeMultimap da Iterable/Collection?
- 25. JUnit uguaglianza sperimentazione di un Iterable
- 26. Perché NodeList non estende Collection o Iterable?
- 27. Convertire un RDD in iterable: PySpark?
- 28. Conversione di Scala Iterable [tupla] in RDD
- 29. Terminologia: Python e Numpy - `iterable` versus` array_like`
- 30. Come chiamare Scala Queue.enqueue (iter: Iterable [B])?
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? –