Sobes.tech
Middle

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.