Məzmuna keç
Educora
Orta20 dəq5 / 14

Funksiyalar və lambdalar

Öz funksiyalarını yaz: susmaya görə qiymətlər və adlı arqumentlər, tək ifadəli funksiyalar, genişləndirmə funksiyaları, lambdalar və yüksək tərtibli funksiyalar.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • Parametrləri və qaytarılan tipi olan funksiya təyin etmək
  • Susmaya görə qiymətlərdən, adlı arqumentlərdən və tək ifadəli funksiyalardan istifadə etmək
  • Mövcud tiplərə genişləndirmə funksiyaları əlavə etmək
  • Lambda yazmaq və onu yüksək tərtibli funksiyaya ötürmək

Təsəvvür et ki, proqramının on yerində eyni salamlama mətnini qurursan. Mətni dəyişmək lazım gələndə on yeri düzəltməli olacaqsan! Funksiya kodu bir dəfə yazıb ona ad verməyə və istədiyin qədər çağırmağa imkan verir. Sən artıq funksiyalarla işləmisən: main, println və repeat funksiyadır. İndi öz funksiyalarını yaradacaqsan.

Funksiyanın təyini

Funksiya fun sözü ilə başlayır, sonra adı və mötərizədə parametrlər gəlir. Kotlin-də hər parametrin tipi mütləq yazılır: name: String. Mötərizədən sonra iki nöqtə ilə qaytarılan tip göstərilir, nəticə isə return ilə qaytarılır. Heç nə qaytarmayan funksiyanın tipi Unit-dir və onu yazmamaq olar.

Kotlin
fun greet(name: String, greeting: String = "Hello"): String {
    return "$greeting, $name!"
}

fun printLine(length: Int = 10) {
    println("-".repeat(length))
}

fun main() {
    println(greet("Aysel"))
    println(greet("Murad", "Salam"))
    println(greet(greeting = "Hi", name = "Leyla"))
    printLine()
    printLine(5)
}
Gözlənilən nəticə
Hello, Aysel!
Salam, Murad!
Hi, Leyla!
----------
-----
  • greeting: String = "Hello" — susmaya görə qiymət: çağırışda arqument verilməsə, "Hello" işlədilir.
  • greet(greeting = "Hi", name = "Leyla") — adlı arqumentlər: parametrin adını yazanda sıra vacib deyil, kod isə daha aydın oxunur.
  • printLine heç nə qaytarmır — onun tipi Unit-dir, sadəcə ekrana yazır.

Tək ifadəli funksiyalar

Funksiyanın bütün işi bir ifadəni hesablamaqdırsa, fiqurlu mötərizələri və return-ü atıb = işarəsindən sonra ifadəni yazmaq olar. Qaytarılan tipi də kompilyator özü müəyyən edir. if və when ifadə olduğu üçün onlar da belə funksiyada işlədilə bilər.

Kotlin
fun square(x: Int) = x * x
fun isEven(n: Int) = n % 2 == 0
fun rectangleArea(width: Double, height: Double) = width * height
fun result(score: Int) = if (score >= 50) "passed" else "failed"

fun main() {
    println(square(7))
    println(isEven(10))
    println(rectangleArea(4.0, 2.5))
    println(result(73))
}
Gözlənilən nəticə
49
true
10.0
passed

Genişləndirmə funksiyaları

Kotlin-də mövcud tipə, hətta String və ya Int kimi standart tipə yeni funksiya «əlavə etmək» olar. Bunun üçün funksiyanın adından əvvəl tipi və nöqtə yazılır: fun String.shout(). Funksiyanın içində this həmin qiymətin özüdür. Belə funksiya sonra adi metod kimi çağırılır: "salam".shout().

Kotlin
fun String.shout() = uppercase() + "!"
fun Int.isEven() = this % 2 == 0
fun Double.toManat() = "$this AZN"

fun main() {
    println("salam".shout())
    println(8.isEven())
    println(12.5.toManat())
}
Gözlənilən nəticə
SALAM!
true
12.5 AZN

Lambdalar

Lambda adsız, qısa funksiyadır və fiqurlu mötərizədə yazılır: { x: Int -> x * 2 }. Oxdan solda parametrlər, sağda gövdə durur; son ifadənin qiyməti lambdanın nəticəsidir. Lambdanı dəyişənə yazmaq olar, onun tipi isə belə göstərilir: (Int) -> Int — «Int alır, Int qaytarır». Lambdanın yalnız bir parametri varsa, onu yazmamaq və gövdədə it adı ilə işlətmək olar.

Kotlin
fun main() {
    val double = { x: Int -> x * 2 }
    val add: (Int, Int) -> Int = { a, b -> a + b }
    val greet: (String) -> String = { "Hello, $it!" }
    println(double(21))
    println(add(3, 4))
    println(greet("Elvin"))
}
Gözlənilən nəticə
42
7
Hello, Elvin!

Yüksək tərtibli funksiyalar

Parametr kimi başqa funksiya qəbul edən (və ya funksiya qaytaran) funksiyaya yüksək tərtibli funksiya deyilir. Aşağıda applyTwice ona verilən əməliyyatı iki dəfə tətbiq edir. Lambda sonuncu arqumentdirsə, onu mötərizədən kənarda yazmaq olar. Hazır funksiyanı isə :: ilə ötürmək mümkündür: ::multiply.

Kotlin
fun applyTwice(x: Int, f: (Int) -> Int): Int = f(f(x))

fun calculate(a: Int, b: Int, operation: (Int, Int) -> Int): Int {
    return operation(a, b)
}

fun multiply(a: Int, b: Int) = a * b

fun main() {
    println(applyTwice(3) { it + 10 })
    println(applyTwice(5) { it * it })
    println(calculate(8, 2) { a, b -> a - b })
    println(calculate(8, 2, ::multiply))
}
Gözlənilən nəticə
23
625
6
16
applyTwice(5) { it * it }: əvvəlcə 5 · 5 = 25, sonra 25 · 25 = 625.

Standart kitabxana lambda qəbul edən funksiyalarla doludur. Keçən dərsdəki repeat(3) { ... } də yüksək tərtibli funksiyadır! Sətirlərdə count şərtə uyğun simvolları sayır, filter isə yalnız onları saxlayır:

Kotlin
fun main() {
    val word = "Programming"
    println(word.count { it == 'm' })
    println(word.filter { it !in "aeiou" })
    println(word.any { it.isDigit() })
    repeat(2) { i -> println("Attempt ${i + 1}") }
}
Gözlənilən nəticə
2
Prgrmmng
false
Attempt 1
Attempt 2
repeat lambdaya addımın nömrəsini 0-dan başlayaraq verir.

Əsas fikirlər

  • Funksiya fun ad(parametr: Tip): QaytarılanTip { ... } şəklində yazılır; heç nə qaytarmayan funksiyanın tipi Unit-dir.
  • Susmaya görə qiymətlər arqumenti istəyə bağlı edir, adlı arqumentlər isə sıradan asılılığı aradan qaldırır.
  • Tək ifadəli funksiya: fun square(x: Int) = x * x.
  • Genişləndirmə funksiyası mövcud tipə yeni metod əlavə edir: fun String.shout().
  • Lambda adsız funksiyadır: { a, b -> a + b }; tək parametr it adlanır.
  • Yüksək tərtibli funksiya başqa funksiyanı parametr kimi alır; sonuncu lambda mötərizədən kənarda yazıla bilər.

Özünü yoxla

10 sual. Hər düzgün cavab XP qazandırır.

1 / 10
fun area(w: Int, h: Int = 2) = w * h olarsa, area(5) nəyə bərabərdir?