Scala foldLeft on Maps

29,641

Solution 1

If you want to use the (a, (k, v)) syntax, you need to advise the compiler to use pattern matching.

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

Note that a case statement requires curly braces.

Solution 2

I think, you can't do the pattern match on tuples as you expect:

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

Actually, using values and sum is simpler.

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

Solution 3

The trick is to use a partial function as the code block, in other words you add a case statement that matches on the arguments:

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

Solution 4

This is not really an answer to your question but I found it useful when starting out with folds, so I'll say it anyway! Note that the /: method "alias" for foldLeft can be clearer for two reasons:

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

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

Note that in the second line:

  • it's more clear that the value y is being folded into the collection xs
  • you can easily remember the ordering of the Tuple2 argument is the same as the ordering of the method "call"
Share:
29,641
Pengin
Author by

Pengin

Updated on December 16, 2020

Comments

  • Pengin
    Pengin over 3 years

    How do you use Map.foldLeft? According to the docs it looks like

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

    But I'm having difficulty:

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

    error: not a legal formal parameter

    The error points to the open bracket in front of k.

  • Daniel C. Sobral
    Daniel C. Sobral over 13 years
    He can pattern match on tuples. To pattern match, though, one needs to use case.
  • Thomas Jung
    Thomas Jung over 13 years
    @Daniel That's the advantage of my lawyer-like sentence: it's correct (he cannot pattern-match as he expected) but I've forgotten the case syntax.
  • Kevin Wright
    Kevin Wright over 13 years
    For problems like this though, using values or mapValues is absolutely the clearest solution (which will almost always make it the right choice)
  • ron_ron
    ron_ron almost 4 years
    Why is pattern matching required? Are there any other patterns which can be matched for in a foldLeft ?
  • NikolaS
    NikolaS almost 2 years
    Thank you sooo much Theo! This is what I've been looking for a while...but how can case be used without match keyword and how come is it being used as destructing action?