Mapa sobre la colección, la desestructuración de manera segura y luego transformando cada elemento. Estos son la semántica que cabe esperar de una expresión como
val b = a map (((x, y), u) => ((y, x), u)))
Desafortunadamente, no hay una sintaxis concisa para lograr esta semántica en Scala. En su lugar, usted tiene que desestructurar a sí mismo:
val b = a map { p => ((p._1._2, p._1._1), p._2) }
Uno podría estar tentado a utilizar una definición de valor de desestructuración:
val b = a map { p => val ((x,y), u) = p; ((y, x), u) }
Sin embargo, esta versión is no more safe than the one that uses explicit pattern matching. Por esta razón, si quieres la semántica desestructuración de seguridad, la solución más concisa es escribir de forma explícita su colección para prevenir ensanchamiento no deseado y el uso explícito reconocimiento de patrones:
val a: List[((Int, Int), Int)] = // ...
// ...
val b = a map { case ((x, y), u) => ((y, x), u) }
Si la definición a
's parece lejos de su uso (por ejemplo, en una unidad de compilación por separado), se puede minimizar el riesgo por atribuir su tipo en el mapa de llamada:
val b = (a: List[((Int, Int), Int)]) map { case ((x, y), u) => ((y, x), u) }
excelente. Gracias. – Owen
Puede omitir un par de paréntesis/corchetes: 'b map {case 1 =>" one "; caso 2 => "dos"} ' –
Con estos constructos, yo sugeriría que siempre escriba explícitamente la colección sobre la que está mapeando.De lo contrario, la ampliación involuntaria del tipo estático (a través de inferencia de tipo o refactorización) podría llevar a errores de tipo que no se detectarán hasta el tiempo de ejecución: https://issues.scala-lang.org/browse/SI-4670 –