Enum
Ringkasan Pelajaran
# Introduction
About
Enum is a very useful module that provides a set of algorithms for working with enumerables. It offers:
- sorting (
sort/2,sort_by/2), - filtering (
filter/2), - grouping (
group_by/3), - counting (
count/2) - searching (
find/3), - finding min/max values (
min/3,max/3), - reducing (
reduce/3,reduce_while/3),
And much more! Refer to the Enum module documentation for a full list.
Enumerable
In general, an enumerable is any data that can be iterated over, a collection. In Elixir, an enumerable is any data type that implements the Enumerable protocol. Those are:
Don’t worry if you don’t know them all yet.
Anyone can implement the Enumerable protocol for their own custom data structure.
Reduce
Enum.reduce/2 allows you to reduce the whole enumerable to a single value. To achieve this, a special variable called the accumulator is used. The accumulator carries the intermediate state of the reduction between iterations. This makes it one of the most powerful functions for enumerables. Many other specialized functions could be replaced by the more general reduce. For example…
Finding the maximum value:
Enum.max([4, 20, 31, 9, 2])
# => 31
Enum.reduce([4, 20, 31, 9, 2], nil, fn x, acc ->
cond do
acc == nil -> x
x > acc -> x
x <= acc -> acc
end
end)
# => 31
And even mapping (but it requires reversing the result afterwards):
Enum.map([1, 2, 3, 4, 5], fn x -> x + 10 end)
# => [11, 12, 13, 14, 15]
Enum.reduce([1, 2, 3, 4, 5], [], fn x, acc -> [x + 10 | acc] end)
# => [15, 14, 13, 12, 11]
Mapping maps
-
With
Map.new/2:%{a: 1, b: 2} |> Map.new(fn {key, value} -> {key, value * 10} end) -
With
Enum.into/3:%{a: 1, b: 2} |> Enum.into(%{}, fn {key, value} -> {key, value * 10} end) -
With
Enum.map/2:%{a: 1, b: 2} |> Enum.map(fn {key, value} -> {key, value * 10} end) |> Enum.into(%{})
Originally from Exercism elixir concepts