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
8
A
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
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)
Verwandte Themen
- 1. Wie zu implementieren Iterable <E>
- 2. Wie kann ich die Iterable-Schnittstelle implementieren?
- 3. Implementieren der Java Iterable <E> Schnittstelle
- 4. Implementieren Sie eine Iterable-Schnittstelle mit einem einzelnen Element
- 5. scala Iterable # map vs. Iterable # flatMap
- 6. ‚numpy.float64‘ Objekt Iterable nicht
- 7. Kombinieren Scala Option [Iterable [_]]
- 8. Convert Iterable in Array
- 9. Convert iterable to RDD
- 10. Scala Iterable Memory Leaks
- 11. junit Prüfung Gleichheit eines Iterable
- 12. Iterable Objekte und Array Typ Hinting?
- 13. Warum <T> nicht Kotlin Array implementieren Iterable <T>
- 14. Testfunktionen iterable in Python Rückkehr
- 15. Verständnis iterable Typen in Vergleichen
- 16. ‚EstablishmentType‘ Objekt ist nicht iterable
- 17. pyspark Säule ist nicht iterable
- 18. Wozu dient die Iterable-Schnittstelle?
- 19. Scala: Join iterable von Strings
- 20. Typeerror-'function‘Objekt ist nicht iterable
- 21. RDD in iterable konvertieren: PySpark?
- 22. Iterable toMap mit konkreter Kartenimplementierung
- 23. Unterschied zwischen Iterator und Iterable
- 24. So sortieren Sie einen Iterable
- 25. Python Fehler: boolsche nicht Iterable
- 26. ManyRelatedManager Objekt ist nicht iterable
- 27. Make int iterable mit verbotenenFruit
- 28. Konvertieren geschachtelte Iterable in Liste
- 29. Wie kann ich ein Java Iterable in ein Scala Iterable konvertieren?
- 30. Reduzieren von Iterable [Entweder [A, B]] zu Entweder [A, Iterable [B]]
Was ist die Leistungslast dieses Codes? Bedeutung: braucht es O (n) Zeit? –
@StefanKunze, * was * braucht O (n) Zeit? Natürlich wird das Index-Lookup linear sein. Aber das ist iterabel, schließlich nicht indexierbar. –
die anfängliche Konvertierung in einen Iterator? –