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ónxs
- 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.