Yüksek seviyeli fonksiyonlar — diğer fonksiyonları parametre olarak alan veya döndüren fonksiyonlardır. Kotlin, davranışı değer olarak rahatça iletmek için lambda ifadelerini kullanır.
fun operateOnNumbers(a: Int, b: Int, operation: (Int, Int) -> Int): Int { return operation(a, b) } val sum = operateOnNumbers(3, 2) { x, y -> x + y } // sum = 5
fun multiply(x: Int, y: Int) = x * y operateOnNumbers(2, 3, ::multiply)
fun makeMultiplier(factor: Int): (Int) -> Int = { x -> x * factor } val triple = makeMultiplier(3) val result = triple(10) // 30
it) sahip olamaz.
(Int, Int) -> Intfonksiyon türü ileFunction2<Int, Int, Int>türünü kullanmak arasındaki fark nedir?
Cevap: Söz dizimi (Int, Int) -> Int, Function2<Int, Int, Int> arayüzü için daha "güzel" bir bildirim (sözdizim şekeri)dir. Pratikte her iki seçenek de tamamen birbirinin yerini alabilir.
val f1: (Int, Int) -> Int = { x, y -> x + y } val f2: Function2<Int, Int, Int> = { x, y -> x + y }
Ama ilk seçenek genellikle okunabilirliği nedeniyle tercih edilir.
Hikaye
Büyük bir olay işleme sisteminde, inline fonksiyonu kullanmadan döngü içinde onlarca lambda ifadesi oluşturuldu. Bu, her çağrıda ayrı bir anonim fonksiyon nesnesi oluşturulduğu için GC üzerinde yüksek yük ve performans düşüşü yarattı.
Hikaye
Bir fonksiyondan başka bir fonksiyonu döndürmeye çalışırken, döndürülen fonksiyonun imzası doğru belirtilmedi, bu da derleme hatasına ve nedenin uzun süre araştırılmasına yol açtı. Hata, türdeki parantezlerin eksikliğindeydi:
fun foo(): Int -> Intyerine doğru olanfun foo(): (Int) -> Intolmalıydı.
Hikaye
Bir geliştirici, tip çıkartılamayan başka bir fonksiyonun parametresi olarak açıkça belirtilmiş bir tipi olmadan lambda kullanmaya çalıştı, bu da "bu parametre için tür çıkartılamaz" hatasına yol açtı. Sorun, lambda veya fonksiyonun parametresi için türün açıkça belirtilmesiyle çözüldü.