5-bo‘lim
Shartlar va when
if ning ifoda ekani, when ning barcha shakllari - qiymat, diapazon, tur va shartsiz - hamda nega Kotlin da uchlik operator yo'q.
Ushbu bo‘lim mundarijasi
Kotlin da shart tekshirishning ikki vositasi bor: tanish if va
ancha kuchliroq when.
if #
fun main() {
val ball = 78
if (ball >= 90) {
println("A'lo")
} else if (ball >= 70) {
println("Yaxshi")
} else {
println("Qoniqarsiz")
}
}
Yaxshi
Shakli boshqa tillardagidek. Lekin Kotlin da if ning yana bir
xususiyati bor.
if - bu ifoda #
fun main() {
val yosh = 20
val holat = if (yosh >= 18) "katta" else "kichik"
println(holat)
val kattasi = if (7 > 12) 7 else 12
println(kattasi)
val baho = if (yosh > 100) {
"juda katta"
} else {
"normal"
}
println(baho)
}
katta
12
normal
if qiymat qaytaradi. Blok shaklida oxirgi qator qaytariladigan
qiymat bo'ladi.
Ko'p tillarda shart ? a : b degan qisqartma bor. Kotlin da u
yo'q - chunki kerak emas.
if (shart) a else b aynan shu vazifani bajaradi va o'qishga
osonroq.
Diqqat: ?: belgisi Kotlin da ham bor, lekin u butunlay boshqa
narsa - "null bo'lsa buni ol" degani. Uni 8-bo'limda ko'ramiz.
val x = if (shart) 5 deb yozib bo'lmaydi.
Kompilyator so'raydi: shart bajarilmasa x ga nima tushadi?
Shuning uchun ifoda sifatida ishlatilganda else shart.
Oddiy ko'rsatma sifatida (qiymat qaytarmasa) esa else ixtiyoriy.
when - qiymat bo'yicha #
fun main() {
val kun = 6
when (kun) {
1 -> println("Dushanba")
2, 3, 4 -> println("Hafta o'rtasi")
5 -> println("Juma")
6, 7 -> println("Dam olish kuni")
else -> println("Noto'g'ri kun")
}
}
Dam olish kuni
when - switch ning o'rnini bosadi, lekin ancha kuchliroq:
- Har bir tarmoq avtomatik tugaydi -
breakyozish kerak emas. - Bir tarmoqda bir nechta qiymat:
2, 3, 4 ->. - Har qanday tur bilan ishlaydi, faqat son va satr emas.
when - ifoda sifatida #
fun main() {
val kun = 3
val nomi = when (kun) {
1 -> "Dushanba"
2 -> "Seshanba"
3 -> "Chorshanba"
else -> "boshqa kun"
}
println(nomi)
println(nomi.length)
}
Chorshanba
10
Ifoda sifatida ishlatilganda else majburiy - kompilyator hamma
holat qamrab olinganiga ishonch hosil qilishi kerak.
Diapazon va shartlar #
fun main() {
val harorat = 27
val tavsif = when (harorat) {
in Int.MIN_VALUE..-1 -> "Sovuq"
in 0..15 -> "Salqin"
in 16..25 -> "Iliq"
in 26..35 -> "Issiq"
else -> "Juda issiq"
}
println(tavsif)
val son = 15
when {
son % 15 == 0 -> println("FizzBuzz")
son % 3 == 0 -> println("Fizz")
son % 5 == 0 -> println("Buzz")
else -> println(son)
}
}
Issiq
FizzBuzz
Ikkinchi when da argument yo'q. Bunday shaklda har bir tarmoq
o'zining to'liq shartini yozadi - bu uzun if/else if zanjirining
o'rnini bosadi.
| Shakl | Ma'nosi |
|---|---|
5 -> | Aynan teng |
1, 2, 3 -> | Sanoqdagilardan biri |
in 1..10 -> | Diapazonda |
!in 1..10 -> | Diapazondan tashqarida |
is String -> | Shu turdagi |
shart -> | Argumentsiz shaklda ixtiyoriy shart |
else -> | Qolgan hamma holat |
Tur bo'yicha tekshirish #
fun tavsifla(qiymat: Any): String = when (qiymat) {
is Int -> "Butun son: ${qiymat + 1}"
is Double -> "Kasr son: ${qiymat * 2}"
is String -> "Matn, uzunligi ${qiymat.length}"
is Boolean -> "Mantiqiy: $qiymat"
is List<*> -> "Ro'yxat, ${qiymat.size} element"
else -> "Noma'lum tur"
}
fun main() {
println(tavsifla(42))
println(tavsifla(2.5))
println(tavsifla("salom"))
println(tavsifla(true))
println(tavsifla(listOf(1, 2, 3)))
}
Butun son: 43
Kasr son: 5.0
Matn, uzunligi 5
Mantiqiy: true
Ro'yxat, 3 element
Diqqat qiling: is Int -> tarmog'ida qiymat + 1 deb yozildi -
hech qanday aylantirish yo'q.
Kompilyator is tekshiruvidan keyin qiymat aniq Int ekanini
biladi va o'zi aylantiradi. Bu aqlli aylantirish deb ataladi va
Kotlin ni Java dan ajratib turadigan qulayliklardan biri.
Java da bu yerda ((Integer) qiymat) + 1 yozish kerak bo'lardi.
when ichida o'zgaruvchi #
fun ball(): Int = 85
fun main() {
val natija = when (val b = ball()) {
in 90..100 -> "A'lo ($b)"
in 70..89 -> "Yaxshi ($b)"
else -> "Past ($b)"
}
println(natija)
}
Yaxshi (85)
when (val b = ...) - funksiya bir marta chaqiriladi va natijasi
hamma tarmoqda ishlatiladi.
Blokli tarmoqlar #
fun main() {
val buyruq = "saqlash"
val javob = when (buyruq) {
"ochish" -> {
val nom = "hisobot.txt"
"Ochilmoqda: $nom"
}
"saqlash", "yozish" -> {
val vaqt = "10:30"
"Saqlandi, vaqt: $vaqt"
}
else -> "Noma'lum buyruq"
}
println(javob)
}
Saqlandi, vaqt: 10:30
Tarmoq blok bo'lsa, oxirgi qator qaytariladigan qiymat bo'ladi.
Shartlarni birlashtirish #
fun main() {
val yosh = 25
val stajYil = 3
val guvohnoma = true
if (yosh >= 21 && stajYil >= 2 && guvohnoma) {
println("Ishga qabul qilinadi")
} else {
println("Talablarga javob bermaydi")
}
println(yosh in 18..65)
println(yosh !in 0..17)
}
Ishga qabul qilinadi
true
true
| Belgi | Ma'nosi |
|---|---|
&& | Va - chapdagi false bo'lsa, o'ngdagi hisoblanmaydi |
|| | Yoki - chapdagi true bo'lsa, o'ngdagi hisoblanmaydi |
! | Emas |
in / !in | Diapazon yoki to'plamda bormi |
in belgisi juda qulay: yosh >= 18 && yosh <= 65 o'rniga
yosh in 18..65 deb yozish mumkin.
- Ball bo'yicha baho qo'yadigan
ifyozing. - O'sha mantiqni
ififodasi sifatida qayta yozing. val x = if (shart) 5deb yozib, xatoni o'qing.- Oy raqamiga qarab fasl nomini
whenbilan chiqaring. whenni ifoda sifatida ishlatib, natijani o'zgaruvchiga oling.in 1..10va!inshakllarini sinang.- Argumentsiz
whenbilan FizzBuzz yozing. Anyturidagi qiymatniisbilan ajrating.- Aqlli aylantirish ishlashini
is String -> qiymat.lengthbilan tekshiring. when (val b = ...)shaklini o'z misolingizda ishlating.
Xulosa #
ifKotlin da ifoda - u qiymat qaytaradi.- Ifoda sifatida ishlatilganda
elsemajburiy. - Kotlin da uchlik operator yo'q -
if/elseuning o'rnini bosadi. when-switchdan kuchliroq:breakkerak emas, bir tarmoqda bir nechta qiymat bo'ladi.whendiapazon (in 1..10), tur (is String) va shartsiz shaklda ishlaydi.- Aqlli aylantirish:
istekshiruvidan keyin qo'shimcha aylantirish yozilmaydi. - Blokli tarmoqda oxirgi qator qaytariladi.
x in 18..65- ikkita solishtirishning qisqa va o'qishli shakli.
Keyingi bo'limda sikllar va diapazonlarni ko'ramiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.