Je me retrouve souvent à travailler avec des listes, des séquences et des itérateurs de tuples et je voudrais faire quelque chose comme ce qui suit,
val arrayOfTuples = List((1, "Two"), (3, "Four"))
arrayOfTuples.map { (e1: Int, e2: String) => e1.toString + e2 }
Cependant, le compilateur ne semble jamais être d'accord avec cette syntaxe. Au lieu de cela, je finis par écrire,
arrayOfTuples.map {
t =>
val e1 = t._1
val e2 = t._2
e1.toString + e2
}
Ce qui est tout simplement stupide. Comment contourner cela?
Une solution consiste à utiliser case
:
arrayOfTuples map {case (e1: Int, e2: String) => e1.toString + e2}
J'aime la fonction tupled; c'est à la fois pratique et non des moindres, tapez safe:
import Function.tupled
arrayOfTuples map tupled { (e1, e2) => e1.toString + e2 }
Pourquoi n'utilisez-vous pas
arrayOfTuples.map {t => t._1.toString + t._2 }
Si vous avez besoin des paramètres plusieurs fois, ou dans un ordre différent, ou dans une structure imbriquée, où _ ne fonctionne pas,
arrayOfTuples map {case (i, s) => i.toString + s}
semble être une forme courte mais lisible.
Une autre option est
arrayOfTuples.map {
t =>
val (e1,e2) = t
e1.toString + e2
}
Notez qu'avec Dotty
(fondation de Scala 3
), découplage des paramètres a été étendu, permettant une telle syntaxe:
// val tuples = List((1, "Two"), (3, "Four"))
tuples.map(_.toString + _)
// List[String] = List("1Two", "3Four")
où chaque _
fait référence dans l'ordre à la partie Tuple associée.