Sobes.tech
Middle

Чӣ гуна бо ҷараёнҳо (streams) дар Kotlin кор кардан мумкин аст?

sobes.tech AI

Ҷавоб аз AI

Дар Kotlin барои кор бо ҷараёнҳои маълумот (монанд ба Java 8 Streams API) функсияҳои васеъкунии маҷмӯаҳо истифода мешаванд, ки аз ҷониби китобхонаи функсияҳои стандартӣ пешниҳод шудаанд. Ин API ҷудогона нест, балки маҷмӯаи усулҳо аз kotlin.collections мебошанд.

Амалиётҳои асосӣ бо ҷараёнҳо ба чунин тақсим мешаванд:

  • Амалиётҳои миёна (Intermediate): Навъи маҷмӯаеро бармегардонад ва "хаста" (дар вақти даъвати амалиёти терминалӣ иҷро мешавад). Мисолҳо: filter, map, flatMap, distinct, sorted, take, drop.
  • Амалиёти терминалӣ (Terminal): Сохторро ба анҷом мерасонад ва натиҷаро бармегардонад (на маҷмӯа). Воқеан иҷрои ҳамаи амалиётҳои миёнаиҳоро фаъол мекунад. Мисолҳо: forEach, reduce, fold, count, sum, average, min, max, toList, toSet, toMap.

Ҳамчунин, мафҳуми ҷараёнҳои пайдарпай (sequences) мавҷуд аст, ки имкон медиҳад, ки хаста бошанд. Sequences элементҳоро як-як, ба эҳтиёҷ коркард мекунанд, ки метавонад барои маҷмӯаҳои калон ё занҷирҳои дарозтари амалиётҳо самараноктар бошад:

  • Таҳия кардани sequence: collection.asSequence()
  • Бозгашт ба маҷмӯа: sequence.toList()
// Намунаи истифодаи функсияҳои стандартӣ барои кор бо ҷараёнҳо
fun processCollection() {
    val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

    val evenSquares = numbers
        .filter { it % 2 == 0 } // Амалиёти миёна: филтр кардани рақамҳои дуруст
        .map { it * it }     // Амалиёти миёна: квадраткунии онҳо

    println(evenSquares) // Амалиёти терминалӣ: нишон додани маҷмӯа (амалиётҳои филтр ва map иҷро мешаванд)

    val sumOfOdd = numbers
        .filter { it % 2 != 0 } // Амалиёти миёна
        .sum()                // Амалиёти терминалӣ: ҳисоб кардани ҷамъи рақамҳои тақсимнашаванда

    println(sumOfOdd)
}

// Намунаи истифодаи sequence
fun processSequence() {
    val largeCollection = (1..1_000_000).toList()

    // Бо маҷмӯаҳо (на хаста): filter ва map барои ҳамаи элементҳо иҷро мешаванд
    val resultCollection = largeCollection
        .filter { it % 2 == 0 }
        .map { it * 2 }
        .take(10) // take(10) пас аз филтр ва map барои ҳамаи элементҳо иҷро мешавад

    println("Result Collection size: ${resultCollection.size}")

    // Бо sequence (хаста): filter, map ва take ба як элемент иҷро мешаванд
    val resultSequence = largeCollection.asSequence()
        .filter { it % 2 == 0 } // filter барои ҳар элемент иҷро мешавад
        .map { it * 2 }     // map барои ҳар элемент, ки аз филтр гузаштааст
        .take(10)         // take(10) коркарро пас аз 10 элемент қатъ мекунад

    println("Result Sequence size: ${resultSequence.toList().size}") // toList() иҷрои sequence-ро оғоз мекунад
}

fun main() {
    processCollection()
    processSequence()
}

Таблицасозии муқоиса байни функсияҳои стандартӣ ва sequences дар бораи хаста будан:

Хусусият Функсияҳои стандартии маҷмӯаҳо Sequences
Хаста будан Хаста будани ғайрзоҳир барои амалиётҳои миёна, аммо амалиёти терминалӣ тамоми занҷирро коркард мекунад Хаста будани равшан: амалиётҳо ба як элемент дар вақти зарурӣ иҷро мешаванд
Самаранокӣ Мумкин аст камтар самарабахш барои маҷмӯаҳои калон ва занҷирҳои дароз аз сабаби маҷмӯаҳои миёна Самарабахштар барои маҷмӯаҳои калон ва занҷирҳои дароз
Барнома Барои маҷмӯаҳои хурд ва миёна мувофиқ аст Барои маҷмӯаҳои калон ё амалиётҳое, ки метавонанд барвақт қатъ шаванд, мувофиқ аст (take, find, first, any, all, none)

Истифодаи функсияҳои стандартӣ дар маҷмӯаҳо бештар кофӣ ва кӯтоҳтар аст. Sequences тавсия дода мешавад, вақте ки хоста равшан барои оптимизатсияи иҷроиш дар кор бо миқдори калонтар аз маълумот лозим аст.