Con frecuencia me encuentro trabajando con listas, secuencias e iteradores de tuplas y me gustaría hacer algo como lo siguiente:
val arrayOfTuples = List((1, "Two"), (3, "Four"))
arrayOfTuples.map { (e1: Int, e2: String) => e1.toString + e2 }
Sin embargo, el compilador nunca parece estar de acuerdo con esta sintaxis. En cambio, termino escribiendo,
arrayOfTuples.map {
t =>
val e1 = t._1
val e2 = t._2
e1.toString + e2
}
Lo cual es una tontería. ¿Cómo puedo evitar esto?
Me gusta la función tuplicada; es conveniente y no menos importante, escriba seguro:
import Function.tupled arrayOfTuples map tupled { (e1, e2) => e1.toString + e2 }
fuente
¿Por qué no usas
Si necesita los parámetros varias veces, o en un orden diferente, o en una estructura anidada, donde _ no funciona,
arrayOfTuples map {case (i, s) => i.toString + s}
parece ser una forma breve pero legible.
fuente
_.toString + _
y quiere manipular nombres más comprensibles quet._1
yt._2
.arrayOfTuples map {case (i, s) => i.toString + s}
es, por supuesto, más útil. Sin embargo, debe hacer la pregunta que tenga para obtener la respuesta que necesita. :)Int + String
mapeo con frecuencia . ;)Otra opcion es
arrayOfTuples.map { t => val (e1,e2) = t e1.toString + e2 }
fuente
Tenga en cuenta que con
Dotty
(foundation ofScala 3
), se ha extendido el desarme de parámetros , lo que permite tal sintaxis:// val tuples = List((1, "Two"), (3, "Four")) tuples.map(_.toString + _) // List[String] = List("1Two", "3Four")
donde cada uno se
_
refiere en orden a la parte de tupla asociada.fuente
Creo que la comprensión es la solución más natural aquí:
for ((e1, e2) <- arrayOfTuples) yield { e1.toString + e2 }
fuente