Scala’da foksiyon içerisinde fonksiyon yaratılabiliyor, bu fonksiyonlar bir referansa atanabiliyor ve parametre olarak başka bir fonksiyona gönderilebiliyor. Bu işlemi kitaplarda “function values” ya da “pass-by-name” olarak bulmanız mümkün.
Bu da kod içerisindeki metodun farklı şekillerde kullanılabilmesini sağlıyor. Örneğin verilen bir liste üzerinde toplama işlemi yapan bir metod kolay bir şekilde tek sayılar üzerinde toplama işlemi yapan hale getirilebiliyor.
Bir örnekle :
object run { | |
def main(args: Array[String]): Unit = { | |
var myList : List[Int] = List.range(1,10) // 1 to 9 liste yaratılır. | |
println("myList : " + myList) | |
println("Sum : " + sumList(myList) ) | |
println("Odd Sum : " + sumList(myList, i => if (i%2 != 0) i else 0 )) | |
println("Odd Sum2 : " + sumList(myList, oddSumBlock )) | |
println("Even Sum : " + sumList(myList, i => if (i%2 == 0) i else 0 )) | |
println("Even Sum2 : " + sumList(myList, evenSumBlock )) | |
//println("Even Sum2 : " + sumList(myList, evenSumBlock() )) // Hata | |
} | |
/* | |
* Toplama işlemi için kullanilan metod. | |
* | |
* @param myList:List[Int] --> Değerleri üzerinde toplama işlemi gerçekleştirilecek dizi | |
* @param realVal:Int => Int --> Toplama işlemindeki istediğim değeri getirecek fonksiyon, kod parçası | |
* | |
* @return Int --> İstenilen toplam değeri | |
* */ | |
def sumList(myList:List[Int], realVal:Int => Int) : Int = { | |
var sum : Int = 0; | |
for(num <- myList){ | |
sum += realVal(num) | |
} | |
sum | |
} | |
/* | |
* Listedeki tüm değerleri ek işlem yapmaksızın toplayan metod. | |
* */ | |
def sumList(myList:List[Int]):Int = { | |
return sumList(myList, i => i) | |
} | |
/* | |
* Değer tek sayı ise ilgili sayıyı, değilse 0 döndüren metod. | |
* | |
* Scala'da bir metodu istersek uzun uzun yazabiliyoruz ve "return" koşulunu koyabiliyoruz. | |
* */ | |
def oddSumBlock(i:Int) : Int = { | |
var r : Int = 0 | |
if( i%2 != 0 ) r = i | |
return r | |
} | |
/* | |
* Değer çift ise ilgili değeri, değil ise 0 döndüren metod | |
* | |
* Scala'da metodları bu kadarcık yazmamız da mümkün. | |
* */ | |
def evenSumBlock(i:Int) = if (i%2 == 0) i else 0 | |
} |
- sumList(myList:List[Int], realVal:Int => Int)metodu birinci parametre olarak toplanacak sayıların tutulduğu integer listesini aldı. İkinci parametre olaraksa realVal ismindeki, dışarıdan tek parametreli Int değeri alan ve geriye Int değer döndüren bir kod bloğu verildi. Bu sayede realVal’ı bundan sonra realVal(a) şeklinde kullanabiliyor olduk.
- Eğer parametre realVal : (Int,Int) => String olarak tanımlanmış olsaydı, vereceğimiz kod bloğu iki parametre alan ve String döndüren bir kod bloğu olmalıydı.
- 7. ve 9. satırlarda doğrudan çağırıldığı yere kod bloğu yerleştirildi.
- 8. ve 10. satırlarda ise, aynı görevi yapacak fonksiyonlar doğrudan parametre olarak yollandı.
- 11. satır hatalıdır. Çünkü çağırılacak fonksiyonun ismi bekleniyor.
Yukarıdaki kodun konsol çıktısı aşağıdaki gibi olur :
myList : List(1, 2, 3, 4, 5, 6, 7, 8, 9) | |
Sum : 45 | |
Odd Sum : 25 | |
Odd Sum2 : 25 | |
Even Sum : 20 | |
Even Sum2 : 20 |
Bu sayede, tek bir toplama metodu ile birden fazla işi yapan toplama metoduna sahip olmuş olduk. Scala’nın sahip olduğu metodları incelerseniz, dışarıdan kod bloğu verebildiğiniz pek çok metod olduğunu görebilirsiniz.