Enum
Koleksiyonlarin numaralandirilmasi icin kullanilan sabit degerler algoritmalari.
Enum
Enum modulu 70’ten fazla fonksiyon icerir. Bunlar daha once inceledigimiz koleksiyonlar ile calismak icin kullanilir.
Bu ders mevcut olan fonksiyonlarin sadece bir kismini icerecektir fakat bunlari asagidaki method ile inceleyebiliriz. Gelin interaktif elixir modunda (IEx) bir deneme yapalim.
iex
iex> Enum.__info__(:functions) |> Enum.each(fn({function, arity}) ->
...>   IO.puts "#{function}/#{arity}"
...> end)
all?/1
all?/2
any?/1
any?/2
at/2
at/3
...Yukaridaki methodu IEx’te calistirdiginizda, yukarida bir kismini gordugunuz enum fonksiyonlarinin listesini, muazzam bir sekilde organize edilmis, fonksiyonel methodlari goreceksiniz. Bunun bir nedeni mevcut, o da numaralandirmanin (enumaration) fonksiyonel programlamanin cekirdegini olusturmasi ve inanilmaz derece kullanisli olmasidir.
Elixir’in de avantajlari ile birlesip gelistiricilere inanilmaz bir guc vermektedir.
Tum fonksiyon listesi icin resmi dokumana Enum goz atabilirsiniz.
Lazy enumeration icin bu Stream sayfaya goz atabilirsiniz.
all?
Diger bircok Enum fonksiyonunda oldugu gibi all?/2 kullanirken de, tum koleksiyonu bir fonksiyon baglariz.  
all?/2 kullanildiginda, tum koleksiyon elemanlarini kosula uydugunda dogru true, uymuyorsa yanlis false donecektir.
iex> Enum.all?(["pire", "deve", "merhaba"], fn(s) -> String.length(s) == 3 end)
false
iex> Enum.all?(["pire", "deve", "merhaba"], fn(s) -> String.length(s) > 1 end)
trueany?
Yukaridakinin aksine, any?/2 herhangibir deger kosula uyuyorsa true donecektir
iex> Enum.any?(["pire", "deve", "merhaba"], fn(s) -> String.length(s) == 7 end)
truechunk_every
Eger koleksiyonu kucuk parcalara bolmek isterseniz, chunk_every/2 yardiminiza yetisecektir:
iex> Enum.chunk_every([1, 2, 3, 4, 5, 6], 2)
[[1, 2], [3, 4], [5, 6]]
chunk_every/4 icin birkac farkli ozellik daha var fakat onlari incelemeyecegiz, buradan inceleyebilirsiniz chunk_every/4.
chunk_by
Eger koleksiyonu buyukluk olarak degilde baska bir sekilde gruplamak istersek, chunk_by/2 methodu kullanilabilir.
Bu metod verilen degerleri ve fonksiyonu alir, ve fonksiyonun dondurdugu deger degistinde yeni grup yaratip bir digerinin olusturulmasina gecer.
Asagida “bir” ve “iki”nin karakter uzunlugu (string.length) 3 iken, “uc”un uzunlugu 2dir, boylece ilk iki sayi bir grup olusturken, ucuncusu yeni bir grup olusturur. Yine “dort”, “uc”un uzunlugundan farkli oldugu icin, yeni bir gruptadir…
iex> Enum.chunk_by(["bir", "iki", "uc", "dort", "bes"], fn(x) -> String.length(x) end)
[["bir", "iki"], ["uc"], ["dort"], ["bes"]]
iex> Enum.chunk_by(["bir", "iki", "uc", "dort", "bes", "alti"], fn(x) -> String.length(x) end)
[["bir", "iki"], ["uc"], ["dort"], ["bes"], ["alti"]]map_every
Bazen koleksiyonu kucuk parcalara basitce ayirmak isimize yaramayabilir. Bu durumda map_every/3 her n inci degeri yakalamak icin
secici bir yontemdir ve kullanisli olabilir. Asagida her ucuncu (ikinci parametre) degere 1000 ekliyoruz.
iex> Enum.map_every([1, 2, 3, 4, 5, 6, 7, 8], 3, fn x -> x + 1000 end)
[1001, 2, 3, 1004, 5, 6, 1007, 8]each
Bazen de koleksiyondaki tum degerlere yeni bir deger olusturmadan ulasmak istenir; bu durumda each/2 kullanilir.
iex> Enum.each(["bir", "iki", "uc"], fn(s) -> IO.puts(s) end)
bir
iki
uc
:ok
Not: each/2 methodu sonda :ok atomu da donmektedir.
map
Herbir degere bir fonksiyon uygulamak icin map/2 fonksiyonunu kullaniriz.
iex> Enum.map([0, 1, 2, 3], fn(x) -> x - 1 end)
[-1, 0, 1, 2]min
min/1 koleksiyondaki en kucuk min degerini bulur:
iex> Enum.min([5, 3, 0, -1])
-1
min/2 de ayni isi yapar, fakat bize bir fonksiyon ile en kucuk degere ulasmamiza izin verir;
iex> Enum.min([], fn -> :pire end)
:piremax
max/1 koleksiyondaki en buyuk max degerini bulur:
iex> Enum.max([5, 3, 0, -1])
5
max/2 de ayni isi yapar, min/2 gibi, fakat bize bir fonksiyon ile en kucuk degere ulasmamiza izin verir;
Enum.max([], fn -> :deve end)
:devereduce
reduce/3 ile koleksiyondaki degerler teke indirilir. Bunu yapmak icin fonksiyona gonderilecek, tercihe bagli bir deger verilir (ilk ornekte 10 verilmis);
eger bu deger verilmezse, koleksiyondaki ilk deger kullanilir.
iex> Enum.reduce([1, 2, 3], 10, fn(x, acc) -> x + acc end)
16
iex> Enum.reduce([1, 2, 3], fn(x, acc) -> x + acc end)
6
iex> Enum.reduce(["a","b","c"], "1", fn(x,acc)-> x <> acc end)
"cba1"sort
Koleksiyonlari siralamaya sort yardimci olan bir degil iki adet siralama fonksiyonu vardir.
sort/1 Erlang’in terim siralamasini kullanarak siralamayi olusturur.
iex> Enum.sort([5, 6, 1, 3, -1, 4])
[-1, 1, 3, 4, 5, 6]
iex> Enum.sort([:pire, "deve", Enum, -1, 4])
[-1, 4, Enum, :pire, "deve"]
Diger secenek sort/2 siralama icin fonksiyon kullanmamizi saglar:
# fonksiyonla
iex> Enum.sort([%{:val => 4}, %{:val => 1}], fn(x, y) -> x[:val] > y[:val] end)
[%{val: 4}, %{val: 1}]
# fonksiyonsuz
iex> Enum.sort([%{:count => 4}, %{:count => 1}])
[%{count: 1}, %{count: 4}]uniq_by
uniq_by/2 metodu koleksiyonda birden fazla tekrarlanan degerleri cikarmak icin kullanilir:
iex> Enum.uniq_by([1, 2, 3, 2, 1, 1, 1, 1, 1], fn x -> x end)
[1, 2, 3]Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!