85 votes

Décompression des tuple dans les opérations cartographiques

Je me retrouve souvent à travailler avec des listes, des séquences et des itérateurs de tuples et j'aimerais 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 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 juste idiot. Comment puis-je contourner cela ?

143voto

Nicolas Points 11558

Une solution de contournement consiste à utiliser case :

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

39 votes

Et vous n'avez même pas besoin de taper les éléments du tuple. case (e1, e2) => c'est suffisant, les types des éléments du tuple sont connus.

33voto

thoredge Points 5829

J'aime bien la fonction tupled ; elle est à la fois pratique et, surtout, sans danger pour les types :

import Function.tupled
arrayOfTuples map tupled { (e1, e2) => e1.toString + e2 }

18voto

user unknown Points 15555

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 un formulaire court, mais lisible.

1 votes

Je suppose que la raison principale est que la plupart du temps, le traitement de la fonction map est bien plus compliqué que _.toString + _ et il veut manipuler des noms plus compréhensibles que t._1 y t._2 .

0 votes

Eh bien, alors arrayOfTuples map {case (i, s) => i.toString + s} est, bien sûr, plus pratique. Cependant, vous devez poser la question que vous vous posez, pour obtenir la réponse dont vous avez besoin :)

0 votes

Eh bien, comme il a dit "fréquemment", j'espère qu'il veut dire "dans différents cas" Je ne vois pas de scénario où vous avez fréquemment besoin d'une Int + String cartographie. ;)

8voto

Kim Stebel Points 22873

Une autre option est

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

4voto

Xavier Guihot Points 6414

À partir de Scala 3 , décomposition 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 de tuple associée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X