I have a List[Message]
and a List[Author]
which have the same number of items, and should be ordered so that at each index, the Message
is from the Author
.
I also have class that we'll call here SmartMessage
, with a constructor taking 2 arguments: a Message
and the corresponding Author
.
What I want to do, is to create a List[SmartMessage]
, combining the data of the 2 simple lists.
Extra question: does List
preserve insertion order in Scala? Just to make sure I create List[Message]
and a List[Author]
with same ordering.
You could use zip
:
val ms: List[Message] = ??? val as: List[Author] = ??? var sms = for ( (m, a) <- (ms zip as)) yield new SmartMessage(m, a)
If you don't like for-comprehensions
you could use map
:
var sms = (ms zip as).map{ case (m, a) => new SmartMessage(m, a)}
Method zip
creates collection of pairs. In this case List[(Message, Author)]
.
You could also use zipped
method on Tuple2
(and on Tuple3
):
var sms = (ms, as).zipped.map{ (m, a) => new SmartMessage(m, a)}
As you can see you don't need pattern matching in map
in this case.
Extra
List
is Seq
and Seq
preserves order. See scala collections overview.
There are 3 main branches of collections: Seq, Set and Map.
List
in scala is linked list, so you should prepend elements to it, not append. See Performance Characteristics of scala collections.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With