Functional Methods on Collections
Posted
by
GlenPeterson
on Programmers
See other posts from Programmers
or by GlenPeterson
Published on 2012-11-02T15:22:36Z
Indexed on
2012/11/02
17:29 UTC
Read the original article
Hit count: 416
I'm learning Scala and am a little bewildered by all the methods (higher-order functions) available on the collections. Which ones produce more results than the original collection, which ones produce less, and which are most appropriate for a given problem? Though I'm studying Scala, I think this would pertain to most modern functional languages (Clojure, Haskell) and also to Java 8 which introduces these methods on Java collections.
Specifically, right now I'm wondering about map with filter vs. fold/reduce. I was delighted that using foldRight() can yield the same result as a map(...).filter(...) with only one traversal of the underlying collection. But a friend pointed out that foldRight() may force sequential processing while map() is friendlier to being processed by multiple processors in parallel. Maybe this is why mapReduce() is so popular?
More generally, I'm still sometimes surprised when I chain several of these methods together to get back a List(List()) or to pass a List(List()) and get back just a List(). For instance, when would I use:
collection.map(a => a.map(b => ...))
vs.
collection.map(a => ...).map(b => ...)
The for/yield command does nothing to help this confusion. Am I asking about the difference between a "fold" and "unfold" operation?
Am I trying to jam too many questions into one? I think there may be an underlying concept that, if I understood it, might answer all these questions, or at least tie the answers together.
© Programmers or respective owner