J'ai un List[Message]
et un List[Author]
qui ont le même nombre d'éléments et doivent être ordonnés de sorte qu'à chaque index, le Message
soit du Author
.
J'ai aussi une classe que nous appellerons ici SmartMessage
, avec un constructeur prenant 2 arguments: un Message
et le Author
correspondant.
Ce que je veux faire, c'est créer un List[SmartMessage]
, combinant les données des 2 listes simples.
Question supplémentaire: List
préserve-t-il l'ordre d'insertion dans Scala? Juste pour être sûr de créer List[Message]
et un List[Author]
avec la même commande.
Vous pouvez utiliser Zip
:
val ms: List[Message] = ???
val as: List[Author] = ???
var sms = for ( (m, a) <- (ms Zip as)) yield new SmartMessage(m, a)
Si vous n'aimez pas for-comprehensions
, Vous pouvez utiliser map
:
var sms = (ms Zip as).map{ case (m, a) => new SmartMessage(m, a)}
La méthode Zip
crée une collection de paires. Dans ce cas, List[(Message, Author)]
.
Vous pouvez également utiliser la méthode zipped
sur Tuple2
(Et sur Tuple3
):
var sms = (ms, as).zipped.map{ (m, a) => new SmartMessage(m, a)}
Comme vous pouvez le voir, vous n'avez pas besoin de correspondance de modèle dans map
dans ce cas.
Extra
List
est Seq
et Seq
préserve l'ordre. Voir aperçu des collections scala .
Il existe 3 principales branches de collections: Seq , Set et Map .
List
in scala est liste liée , vous devez donc y ajouter des éléments et non les ajouter. Voir Caractéristiques de performance de scala collections.