Enum in Elixir
| Map and filter | |
| Reduce | |
| Sort and uniq | |
| Find and reject |
Map and filter
Enum is the toolkit for collections, and map plus filter are its daily pair. Map transforms every element, while filter keeps only the elements that pass a test.
[1, 2, 3, 4]
|> Enum.map(&(&1 * 2))
|> Enum.filter(&(&1 > 4))
Doubling gives 2, 4, 6, 8, and keeping values above 4 leaves 6 and 8. Both functions return fresh lists and never touch the original.
Reduce
Reduce folds a whole collection into one value by carrying an accumulator through each element. You name the starting value, and the tiny function says how each element joins it.
Enum.reduce([1, 2, 3, 4], 0, &(&1 + &2))
Starting from 0 and adding each element gives 10, the total of the list. Sums, products, and grouped maps all grow from this one folding pattern.
Sort and uniq
Sort arranges elements and uniq drops neighbours that repeat, so the pair turns messy input into a clean ordered set. Sort first, because uniq only removes duplicates that sit side by side.
[3, 1, 2, 1, 3]
|> Enum.sort()
|> Enum.uniq()
Sorting lines the values up as 1, 1, 2, 3, 3, and uniq trims the doubles to 1, 2, 3. Pass a custom compare function to sort when plain order is not what you need.
Find and reject
Find returns the first element that passes a test, while reject returns all elements that fail it. They answer opposite questions with the same tiny predicate shape.
Enum.find([1, 2, 3, 4], &(&1 > 2))
Enum.reject([1, 2, 3, 4], &(&1 > 2))
Find stops at 3, the first value above 2, and reject keeps 1 and 2 while dropping the rest. When nothing matches, find calmly returns nil instead of raising.
Next: Stream in Elixir
Article author: Arthur Isaev