- 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.
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)
}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.printLineheç nə qaytarmır — onun tipiUnit-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.
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))
}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().
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())
}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.
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"))
}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.
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))
}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:
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}") }
}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 tipiUnit-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 parametritadlanı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.
fun area(w: Int, h: Int = 2) = w * h olarsa, area(5) nəyə bərabərdir?