ProgramlamaKotlin geliştirici

Kotlin'de yüksek seviyeli fonksiyonlar ve lambda ifadeleri nasıl uygulanır? Fonksiyonların geçişi ve dönüşü ile ilgili nüansları, sözdiziminin özelliklerini, temel kısıtlamaları açıklayın ve kod örnekleri verin.

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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.

Tanımlama Örneği:

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

Fonksiyonların Geçişi:

  • Fonksiyonlar yalnızca lambda ifadesi olarak değil, referans yoluyla da iletilebilir:
fun multiply(x: Int, y: Int) = x * y operateOnNumbers(2, 3, ::multiply)

Fonksiyon Dönüşü:

fun makeMultiplier(factor: Int): (Int) -> Int = { x -> x * factor } val triple = makeMultiplier(3) val result = triple(10) // 30

Özellikler:

  • Lambda, birden fazla isimlendirilmemiş parametreye (it) sahip olamaz.
  • Fonksiyona isimlendirilmiş parametreler geçirilebilir, ancak türlerin açıkça belirtilmesi gerekir, tür çıkartılamadığında.
  • Lambda ifadeleri — nesnelerdir (anonim sınıflar), bu çok sayıda çağrıda performansı etkiler (inline fonksiyonlar ile çözülür).
  • Değişkenler içeren lambda ifadeleri için closure (kapsayıcı) kullanılır.

Aldatıcı Soru.

(Int, Int) -> Int fonksiyon türü ile Function2<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.

Bilinmemesi nedeniyle gerçek hatalar örnekleri.


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 -> Int yerine doğru olan fun foo(): (Int) -> Int olmalı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ü.