Kotlin'da oqimlar (streams) bilan qanday ishlash mumkin?
sobes.tech AI
AIdan javob
Kotlin'da, ma'lumot oqimlari bilan ishlash uchun (Java 8 Streams API ga o'xshash) standart funksiyalar kutubxonasida taqdim etilgan kolleksiyalar uchun kengaytirish funksiyalari ishlatiladi. Bu alohida API emas, balki kotlin.collections ichidagi metodlar to'plamidir.
Asosiy oqim operatsiyalari quyidagilarga bo'linadi:
- Oraliq operatsiyalar: Yangi kolleksiya qaytaradi va "suxbat" (faqat terminal operatsiya chaqirilganda bajariladi). Misollar:
filter,map,flatMap,distinct,sorted,take,drop. - Terminal operatsiyalar: Operatsiyalar ketma-ketligini yakunlaydi va natija (kolleksiya emas) qaytaradi. Barcha oraliq operatsiyalarni bajaradi. Misollar:
forEach,reduce,fold,count,sum,average,min,max,toList,toSet,toMap.
Shuningdek, ketma-ketliklar (sequences) tushunchasi mavjud bo'lib, bu aniq suyuqlikni ta'minlaydi. Ketma-ketliklar elementlarni birma-bir, ehtiyoj bo'lsa, ishlaydi, bu katta kolleksiyalar yoki uzun operatsiyalar zanjirlari uchun samaraliroq bo'lishi mumkin:
- Ketma-ketlik yaratish:
collection.asSequence() - Qayta kolleksiyaga aylantirish:
sequence.toList()
// Standart funksiyalar yordamida oqim bilan ishlash misoli
fun processCollection() {
val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val evenSquares = numbers
.filter { it % 2 == 0 } // Oraliq operatsiya: juft sonlarni filtrlash
.map { it * it } // Oraliq operatsiya: kvadratga oshirish
println(evenSquares) // Terminal operatsiya: kolleksiyani chiqarish (filter va map bajariladi)
val sumOfOdd = numbers
.filter { it % 2 != 0 } // Oraliq
.sum() // Terminal (toq sonlarning yig'indisini hisoblash)
println(sumOfOdd)
}
// Ketma-ketliklar bilan ishlash misoli
fun processSequence() {
val largeCollection = (1..1_000_000).toList()
// Kolleksiyalar bilan (suyuqlik emas): filter va map darhol barcha elementlar uchun bajariladi
val resultCollection = largeCollection
.filter { it % 2 == 0 }
.map { it * 2 }
.take(10) // take(10) filter va map dan so'ng bajariladi
println("Natija kolleksiyasi o'lchami: ${resultCollection.size}")
// Ketma-ketliklar bilan (suyuqlik): filter, map va take elementma-element bajariladi
val resultSequence = largeCollection.asSequence()
.filter { it % 2 == 0 } // filter har bir element uchun ketma-ket bajariladi
.map { it * 2 } // map har bir o'tgan element uchun bajariladi
.take(10) // take(10) 10 elementdan so'ng jarayonni to'xtatadi
println("Natija ketma-ketlik o'lchami: ${resultSequence.toList().size}") // toList() ketma-ketlikni bajaradi
}
fun main() {
processCollection()
processSequence()
}
Standart funksiyalar va ketma-ketliklar haqida suyuqlik haqida taqqoslash jadvali:
| Xususiyat | Standart kolleksiya funksiyalari | Ketma-ketliklar |
|---|---|---|
| Suyuqlik | Oraliq operatsiyalar uchun yashirin suyuqlik, ammo terminal operatsiya butun oraliq zanjirni bajaradi | Aniq suyuqlik: operatsiyalar ehtiyoj bo'lsa, elementma-element bajariladi |
| Samardorlik | Katta kolleksiyalar va uzun operatsiyalar zanjirlari uchun kamroq samarali bo'lishi mumkin, chunki oraliq kolleksiyalar mavjud | Katta kolleksiyalar va uzun operatsiyalar uchun samaraliroq |
| Qo'llanilishi | Kichik va o'rtacha kolleksiyalar uchun mos | Katta kolleksiyalar yoki erta to'xtatilishi mumkin bo'lgan operatsiyalar uchun mos (take, find, first, any, all, none) |
Standart funksiyalarni kolleksiyalarda ishlatish odatda etarli va qisqaroq. Ketma-ketliklar, katta hajmdagi ma'lumotlar bilan ishlashda unumdorlikni oshirish uchun aniq suyuqlik talab qilinsa, tavsiya etiladi.