Tuple Unpacking in Map Operations

ScalaMapIteratorTuplesIterable Unpacking

Scala Problem Overview


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?

Scala Solutions


Solution 1 - Scala

A work around is to use case :

arrayOfTuples map {case (e1: Int, e2: String) => e1.toString + e2}

Solution 2 - Scala

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 - Scala

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 - Scala

Another option is

arrayOfTuples.map { 
    t => 
    val (e1,e2) = t
    e1.toString + e2
}

Solution 5 - Scala

Starting in Scala 3, parameter untupling has been extended, allowing such a syntax:

// val tuples = List((1, "Two"), (3, "Four"))
tuples.map(_.toString + _)
// List[String] = List("1Two", "3Four")

where each _ refers in order to the associated tuple part.

Solution 6 - Scala

I think for comprehension is the most natural solution here:

for ((e1, e2) <- arrayOfTuples) yield {
  e1.toString + e2
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionduckworthdView Question on Stackoverflow
Solution 1 - ScalaNicolasView Answer on Stackoverflow
Solution 2 - ScalathoredgeView Answer on Stackoverflow
Solution 3 - Scalauser unknownView Answer on Stackoverflow
Solution 4 - ScalaKim StebelView Answer on Stackoverflow
Solution 5 - ScalaXavier GuihotView Answer on Stackoverflow
Solution 6 - ScalaYahorView Answer on Stackoverflow