Kotlin: Higher Order Functions

M. Enes Durak
2 min readJun 25, 2023

--

Selamlar!
Bu yazımda higher order functions konusunu inceleyeceğiz. Higher order functionsa geçmeden önce lambda expressions ve anonymous functions başlıklarını irdeleyelim. O zaman başlayalım!

Lambda Expressions

Lambda expressionlar ve anonymous functionlar function literals olarak adlandırılırlar. Yani deklare edilmeden anlık olarak kullanabilen bir yapıya sahiptirler.

  • Lambda expression süslü parantezle başlar ve süslü parantezle biter.
  • İlk süslü parantezden sonra parametreler ve tipleri yazılır. Parametreler birbirinden virgül ile ayrılır.
  • Parametrelerden sonra “->” işareti konulur ve sonrasında fonksiyon body’si yazılır.
  • Eğer dönüş tipi Unit değilse fonksiyon body’sinin son satırı dönüş değeri olarak alınır.
val sumWithLambda = { a: Int, b: Int ->
a + b
}

Eğer bir fonksiyonun son parametresi bir fonksiyon ise bu fonksiyonun son parametresini parantezlerin dışına alıp bir lambda expression olarak verebiliriz.

//    public inline fun <T> Iterable<T>.forEach(action: (T) -> Unit): Unit {
// for (element in this) action(element)
// }

val addTen = items.forEach { number: Int ->
number+ 10
}

it Kullanımı

Eğer lambda expressionunuz tek parametre bekliyorsa parametre adını ve “->” işaretini kullanmayabilirsiniz. Bu tip bir kullanımda süslü parantezlerin içinde parametrenize it yazarak ulaşabilirsiniz.

val addTen = items.forEach { it + 10 }

Kullanılmayan lambda parametresinin ismi alt çizgi( _ ) ile değiştirilebilir.

val addTen = { a: Int, _: Int ->
a + 10
}

Anonymous Functions

Lambda expression kullandığımızda geri dönüş tipini açık açık yazamıyoruz. Böyle bir ihtiyacımız olduğunda anonymous function kullanabiliriz. Anonymous functionların normal fonksiyonlardan farkı isimsiz olmalarıdır.

fun(x: Int, y: Int): Int = x + y

Fonksiyonların Referans Gösterimi

Kotlin fonksiyonların tip olarak verilmesine olanak sağlar. Bu tip kullanıma fonksiyonların referans gösterimi deriz.

val sumFunction: (Int, Int) -> Int = { 
number1:Int, number2:Int -> number1+number2
}

Referans gösterim right-associative çalışır. Yani sağ taraftan çağırılarak ilerler. (Int) -> (Int) -> Int şeklinde bir kullanım, (Int) -> ((Int) -> Int) şeklinde bir kullanım ile aynıdır. Fakat ((Int) -> (Int)) -> Int bunlardan farklı bir işleme tabi tutulur.

Higher Order Functions

Sıra geldi günün yıldızına. Parametre olarak fonksiyon alan veya fonksiyon döndüren fonksiyonlara higher order function diyoruz.

val sum: (Int, Int) -> Int = { num1, num2 -> num1 + num2 }

fun higherOrder(number1: Int, number2: Int, operation: (Int, Int) -> Int): Int =
operation(number1, number2)

println(higherOrder(3, 4, sum))

Fonksiyon referansını “::” işareti ile de oluşturabiliriz. Varsa fonksiyonun beklediği parametreleri “::” işaretinden önce, işaretten sonra ise fonksiyonun adını yazarak referansını oluşturabiliriz. Bu konuda daha detaylı bilgiyi ileride reflection konusunda göreceğiz.

fun sum(num1:Int, num2:Int): Int = num1 + num2

fun applyOperation(number1: Int, number2: Int, operation: (Int, Int) -> Int): Int =
operation(number1, number2)

println(applyOperation(3, 4, ::sum))

Okuduğun için teşekkür ederim. Yeni bir yazıda görüşmek üzere!

Kaynaklar:
- Halil Özcan
- kotlinlang.org
- Antonio Leiva

--

--