Mengenal fungsi filter, map dan reduce di Elixir
Elixir adalah bahasa pemrograman fungsional, pada saat mengembangkan aplikasi tidak lepas dengan ketiga fungsi tersebut. Nah kali ini saya
ingin berbagi sedikit ilmu tentang 3 fungsi yaitu filter
, map
dan reduce
, apa perbedaannya dan kapan harus menggunakannya.
filter(enumerable, fun)
Fungsi filter
berguna untuk menyaring data sesuai dengan parameter fun
dan mengembalikan hanya nilai yang benar(sesuai argumen fun
).
Perlu diperhatikan bahwa fungsi filter
tidak merubah tipe data tetapi hanya merubah jumlah data. Misalkan kita ingin mencari semua angka
genap dari sebuah list(array), maka kodenya seperti ini:
Enum.filter([1, 2, 3, 4, 5], fn x -> rem(x, 2) == 0 end) |> IO.inspect()
Bagaimana kalau bentuk datanya berupa list map atau struct?. Penggunaannya akan tetap sama seperti pada tipe data list.
Misal kita akan mencari data dari sebuah list map User
yang group_id
nya sama dengan 2.
user = [
%{id: 1, group_id: 1, name: "Agus"},
%{id: 2, group_id: 2, name: "Susilo"}
]
Enum.filter(user, fn x -> x.group_id == 2 end) |> IO.inspect()
# output: [%{group_id: 2, id: 2, name: "Susilo"}]
map(enumerable, fun)
Fungsi map
berguna untuk menerapakan argumen fun
ke semua elemen pada argumen enumerable
. Berbeda dengan fungsi filter
yang tidak merubah tipe data, fungsi map
akan merubah tipe data tetapi tidak merubah jumlah elemennya.
num = [1, 2, 3]
Enum.map(num, fn x -> x * 2 end) |> IO.inspect()
# output: [2, 4, 6]
Contoh untuk data list map, dapat dilihat bahwa bentuk data berubah dari map menjadi tuple.
user = [
%{id: 1, group_id: 1, name: "Agus"},
%{id: 2, group_id: 2, name: "Susilo"}
]
Enum.map(user, fn x -> {x.id, x.name}) |> IO.inspect()
# output: [{1, "Agus"}, {2, "Susilo"}]
reduce(enumerable, acc, fun)
Fungsi reduce
akan merubah jumlah elemen pada hasil dan merubah tipe datanya, namun tidak selalu fungsi harus merubah
tipe data.
user = [
%{id: 1, group_id: 1, name: "Agus"},
%{id: 2, group_id: 2, name: "Susilo"}
]
Enum.reduce(user, [], fn item, acc ->
if item.id == 1 do
acc
else
acc ++ [{item.id, item.name}]
end
end) |> IO.inspect()
# output: [{2, "Susilo"}]
Pada contoh kode di atas fungsi reduce
merubah tipe data dari map
menjadi tuple
dan merubah jumlah data dari 2 menjadi cuma 1 data saja.
Setelah kita tahu perbedaan dan kapan penggunaan fungsi-fungsi di atas, semoga kode kita dapat lebih berkualitas dan benar.
Sekian, semoga bermanfaat.