Also, nur um zu klären, was bei der Implementierung geschieht.
Erstens könnten Sie verstehen müssen, wie für das Verständnis funktioniert.
https://docs.scala-lang.org/tutorials/FAQ/yield.html
Scala „für Comprehensions“ sind syntaktischer Zucker für Zusammensetzung mehrere Operationen mit foreach, Karte, flatMap, Filter oder withFilter.
Und die Tatsache, dass der Code nicht yield
alles wird in forEach
Methode übersetzt werden, die Unit
Rückgabetyp hat, das heißt, dass Sie nie Liste aus ihm heraus.
Ich versuche, wird Ihr Code Schritt für Schritt zu ändern.
for (id <- 1 to 10) {
allocs.map(alloc => Alloc.apply(alloc.segId, id, alloc.cos, alloc.fare, alloc.type, false, alloc.cosLev))
}
Sie brauchen nicht explizit apply
nennen. Die apply
Methode ist nur ein syntaktischer Zucker, der, wenn Sie es implementieren, Sie es einfach wie eine Funktion verwenden können. In diesem Fall hat case class
die Arbeit für Sie erledigt.
(mehr zu diesem Thema hier: https://twitter.github.io/scala_school/basics2.html#apply)
for (id <- 1 to 10) {
allocs.map(alloc => Alloc(alloc.segId, id, alloc.cos, alloc.fare, alloc.type, false, alloc.cosLev))
}
Und Sie Verständnis nicht brauchen hier, auch weil die Dinge, die aktualisiert werden, sind nur id
und promo
so können Sie copy
bereitgestellt verwenden von case class
.
allocs.map(alloc => alloc.copy(id = id, promo = false))
von nur
allocs.map(_.copy(id = id, promo = false))
Sie möchten die ID von 1 bis 10 füllen, so dass Sie nur zip
sie zusammen, welche zurückkehren Liste [(Int, Alloc)] und wo es sich teilweise mit Funktion zur Mustererkennung und Destrukturierung des Tupels.
(mehr Teilfunktion: https://twitter.github.io/scala_school/pattern-matching-and-functional-composition.html#PartialFunction)
allocs
.zip(1 to 10)
.map {
case (alloc, id) => alloc.copy(id = id.toString, promo = false)
}
Und, ja, wenn Sie mögen, können Sie zipWithIndex
als Mikel vorschlagen verwenden.
Das letzte, was ich hervorheben möchte, ist, sehe ich type
als eine Eigenschaft von Alloc
, die Typ String
hat.
Dies ist möglicherweise nicht mit der Frage verbunden, aber Sie können die Macht der Scala-System mehr nutzen, um die Richtigkeit Ihres Programms zu gewährleisten. Da weniger möglicher Wert mehr Berechenbarkeit bedeutet. Daher sollten Sie stattdessen den Sum-Typ (oder Union-Typ) verwenden.
(mehr Summe Typ: http://tpolecat.github.io/presentations/algebraic_types.html#11)
Werfen Sie einen Blick auf https://stackoverflow.com/questions/9891407/getting-the-desugared-part-of-a-scala-for-comprehension-expression - Dann sollte es einfacher sein, http://docs.scala-lang.org/overviews/parallel-collections/overview.html#creating-a-parallel-collection – Reactormonk
Was sind die IDs von Allocs, bevor Sie zuordnen? Wie werden sie überhaupt erzeugt? Ich frage mich nur, warum es nicht zusammen mit anderen generiert wird. – iboss
IDs sind String, sie sind initialisiert mit "" – Silverouge