spark scala scala-2.8 scala-collections

scala - foldleft spark



Scala foldLeft en mapas (4)

¿Cómo se utiliza Map.foldLeft? Según los docs parece

foldLeft [B] (z: B)(op: (B, (A, B)) ⇒ B) : B

Pero estoy teniendo dificultades:

Map("first"->1,"second"->2).foldLeft(0)((a,(k,v)) => a+v )

error: no es un parámetro formal legal

El error apunta al corchete abierto delante de k.


Creo que, no puedes hacer que el patrón coincida con las tuplas como esperas:

Map("first"->1,"second"->2).foldLeft(0)((a, t) => a + t._2)

En realidad, usar valores y sumas es más simple.

Map("first"->1,"second"->2).values.sum


El truco es usar una función parcial como bloque de código, en otras palabras, agregue una declaración de case que coincida con los argumentos:

Map("first" -> 1, "second" -> 2).foldLeft(0) { case (a, (k, v)) => a + v }


Esta no es realmente una respuesta a tu pregunta, pero me pareció útil cuando empecé con los pliegues, ¡así que lo diré de todos modos! Tenga en cuenta que el método /: "alias" para foldLeft puede ser más claro por dos razones:

xs.foldLeft(y) { (yy, x) => /* ... */ } (y /: xs) { (yy, x) => /* ... */ }

Tenga en cuenta que en la segunda línea:

  • es más claro que el valor y se está plegando en la colección xs
  • Puede recordar fácilmente que el orden del argumento Tuple2 es el mismo que el orden del método "llamada"

Si desea utilizar la sintaxis (a, (k, v)) , debe recomendar al compilador que utilice la coincidencia de patrones.

Map("first"->1, "second"->2).foldLeft(0){ case (a, (k, v)) => a+v }

Tenga en cuenta que una declaración de case requiere llaves.