2017-09-04 2 views
0

Ich habe eine Liste dieses Objekts:Wie man in scala korrekt abbildet?

case class Alloc(
         segId: String, 
         paxId: String, 
         cos: String, 
         fare: String, 
         type: String, 
         promo: Boolean, 
         cosLev: String) 

, ich habe derzeit eine Liste von 10, alle Attribute haben einen Wert außer paxId, alle zum Gegenstand haben „“. Nun würde Ich mag jede paxId inkrementieren, ich meine paxId wie mit = 1 für den ersten Alloc, 2 für den zweiten, ... und 10 für die zehnte. Ich habe dies versucht:

val allocWithPaxIds: List[Allocation] = for (id <- 1 to 10) { 
     allocs.map(alloc=>Alloc.apply(alloc.segId, id, alloc.cos, alloc.fare, alloc.type, false, alloc.cosLev)) 
    } 

Allocs mit dem alloc ohne paxIds

Ich bin Anfänger in scala und ich bin verloren, hoffen, dass Sie in der Lage sein werde, mir zu helfen.

Vielen Dank im Voraus

+0

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

+0

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

+0

IDs sind String, sie sind initialisiert mit "" – Silverouge

Antwort

2

Sie zipWithIndex und dann copy verwenden verwenden können, um nur ein Feld von jedem

Objekt zu ändern
list.zipWithIndex.map{ 
    case (v, idx) => v.copy(paxId = idx.toString) 
} 
+0

funktioniert super! Danke vielmals! :) – Silverouge

0

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)

Verwandte Themen