web-dev-qa-db-fra.com

Déballage de tuple dans les opérations de carte

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?

71
duckworthd

Une solution consiste à utiliser case:

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

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 }
29
thoredge

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.

16
user unknown

Une autre option est

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

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.

0
Xavier Guihot