Tuple Unpacking in Map Operations
I frequently find myself working with Lists, Seqs, and Iterators of Tuples and would like to do something like the following,
val arrayOfTuples = List((1, "Two"), (3, "Four"))
arrayOfTuples.map { (e1: Int, e2: String) => e1.toString + e2 }
However, the compiler never seems to agree with this syntax. Instead, I end up writing,
arrayOfTuples.map {
t =>
val e1 = t._1
val e2 = t._2
e1.toString + e2
}
Which is just silly. How can I get around this?
Solution 1:
A work around is to use case
:
arrayOfTuples map {case (e1: Int, e2: String) => e1.toString + e2}
Solution 2:
I like the tupled function; it's both convenient and not least, type safe:
import Function.tupled
arrayOfTuples map tupled { (e1, e2) => e1.toString + e2 }
Solution 3:
Why don't you use
arrayOfTuples.map {t => t._1.toString + t._2 }
If you need the parameters multiple time, or different order, or in a nested structure, where _ doesn't work,
arrayOfTuples map {case (i, s) => i.toString + s}
seems to be a short, but readable form.
Solution 4:
Another option is
arrayOfTuples.map {
t =>
val (e1,e2) = t
e1.toString + e2
}