Have you ever mapped a list, then filtered it? Or filtered first, then mapped? Why not do it all in one pass with mapfilter?
mapfilter is a function that combines the traditional map & filter of functional programming by using the following logic:
- if your function returns false, then the element is discarded
- any other return value is mapped into the list
Doing a map and then a filter is O(2N), whereas mapfilter is O(N). That’s twice as a fast! If you are dealing with large lists, this can be a huge time saver. And for the case where a large list contains small IDs for looking up a larger data structure, then using mapfilter can result in half the number of database lookups.
Obviously, mapfilter won’t work if you want to produce a list of boolean values, as it would filter out all the false values. But why would you want to map to a list booleans?
Here’s some erlang code I’ve been using for a while:
mapfilter(F, List) -> lists:reverse(mapfilter(F, List, )). mapfilter(_, , Results) -> Results; mapfilter(F, [Item | Rest], Results) -> case F(Item) of false -> mapfilter(F, Rest, Results); Term -> mapfilter(F, Rest, [Term | Results]) end.
Has anyone else done this for themselves? Does mapfilter exist in any programming language? If so, please leave a comment. I think mapfilter is a very simple & useful concept that should be a included in the standard library of every (functional) programming language. Erlang already has mapfoldl (map-reduce in one pass), so why not also have mapfilter?