0Pricing
Kotlin Academy · درس

‏fold وreduce وrunningFold

اجمع عناصر المجموعات باستخدام fold وreduce ودوال التراكم.

‏fold وreduce وrunningFold درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.

عمليات التجميع

تجمع fold وreduce المجموعة في قيمة واحدة. تقبل fold قيمة ابتدائية، بينما تستخدم reduce العنصر الأول قيمةً ابتدائية. وتُرجع runningFold كل نتيجة وسيطة.

fold الأساسية

تبدأ fold(seed) { acc, x -> ... } بقيمة ابتدائية وتجمع كل عنصر مع المراكم.

fun main() {
    val nums = listOf(1, 2, 3, 4)
    val sum = nums.fold(0) { acc, n -> acc + n }
    println(sum) // 10
}

fold مع قيمة ابتدائية غير رقمية

يمكن أن تكون القيمة الابتدائية من أي نوع. إذ يمكن لـ fold تحويل List<T> إلى نتيجة مختلفة تمامًا.

fun main() {
    val words = listOf("hello", "world", "kotlin")
    val joined = words.fold("") { acc, w -> if (acc.isEmpty()) w else "$acc, $w" }
    println(joined) // hello, world, kotlin
}

reduce الأساسية

تستخدم reduce العنصر الأول قيمةً ابتدائية. وتجمع اللامبدا عنصرين في كل مرة.

fun main() {
    val nums = listOf(2, 3, 4, 5)
    val product = nums.reduce { acc, n -> acc * n }
    println(product) // 120
}

تطلق reduce استثناءً مع القوائم الفارغة

تتطلب reduce عنصرًا واحدًا على الأقل. استخدم reduceOrNull للأمان، أو فضّل fold مع قيمة ابتدائية.

fun main() {
    val empty: List<Int> = emptyList()
    println(empty.reduceOrNull { a, b -> a + b }) // null
    println(empty.fold(0) { a, b -> a + b })       // 0
}

fold مقارنةً بـ reduce

استخدم fold عندما تحتاج إلى نوع نتيجة مختلف أو قيمة افتراضية. واستخدم reduce عندما يطابق نوع النتيجة نوع العنصر وتحتوي القائمة على عنصر واحد على الأقل.

fun main() {
    val nums = listOf(1, 2, 3, 4)
    println(nums.reduce { a, b -> a + b })       // 10
    println(nums.fold(100) { a, b -> a + b })   // 110 (seed 100)
}

runningFold

تُرجع runningFold قائمةً بكل قيمة وسيطة للمراكم، وهي مفيدة للمجاميع التراكمية ومسارات المعالجة خطوةً بخطوة.

fun main() {
    val nums = listOf(1, 2, 3, 4)
    val running = nums.runningFold(0) { acc, n -> acc + n }
    println(running) // [0, 1, 3, 6, 10]
}

مثال على المجموع التراكمي

نمط شائع في التحليلات: الإجمالي التراكمي من شهر إلى آخر.

fun main() {
    val monthly = listOf(100, 150, 80, 200, 120)
    val cumulative = monthly.runningReduce { acc, x -> acc + x }
    println(cumulative) // [100, 250, 330, 530, 650]
}

إنشاء Map باستخدام fold

حوّل قائمةً إلى Map باستخدام fold، عبر التجميع في خريطة قابلة للتغيير.

fun main() {
    val words = listOf("apple", "banana", "cherry")
    val byLetter = words.fold(mutableMapOf<Char, MutableList<String>>()) { acc, w ->
        val key = w[0]
        acc.getOrPut(key) { mutableListOf() }.add(w)
        acc
    }
    println(byLetter)
}

إنشاء List باستخدام fold

يمكن لـ fold تحويل تسلسل إلى قائمة منظمة، مثل تجميع التكرارات المتتالية.

fun main() {
    val nums = listOf(1, 1, 2, 3, 3, 3, 4)
    val grouped = nums.fold(mutableListOf<MutableList<Int>>()) { acc, n ->
        if (acc.isEmpty() || acc.last().last() != n) acc.add(mutableListOf(n))
        else acc.last().add(n)
        acc
    }
    println(grouped) // [[1, 1], [2], [3, 3, 3], [4]]
}

foldIndexed

مرّر الفهرس مع كل عنصر، وهو مفيد في التجميع الذي يراعي الموضع.

fun main() {
    val nums = listOf(10, 20, 30)
    val weighted = nums.foldIndexed(0) { i, acc, n -> acc + (i + 1) * n }
    // 1*10 + 2*20 + 3*30 = 140
    println(weighted)
}

reduceRight

تجمع reduceRight العناصر من اليمين إلى اليسار. ويهم ذلك عندما لا تكون العملية تبديلية، مثل ترتيب دمج السلاسل النصية.

fun main() {
    val words = listOf("a", "b", "c", "d")
    val leftToRight = words.reduce { acc, w -> "$acc-$w" }
    val rightToLeft = words.reduceRight { w, acc -> "$w-$acc" }
    println(leftToRight)   // a-b-c-d
    println(rightToLeft)   // a-b-c-d (same here but operation matters)
}

تحقق سريع

أي دالة تُرجع قائمة تحتوي على كل قيمة وسيطة للمراكم؟

مراجعة

تجمع fold العناصر باستخدام قيمة ابتدائية من أي نوع. وتستخدم reduce العنصر الأول قيمةً ابتدائية، لذا يجب ألا تكون القائمة فارغة. وتُرجع runningFold وrunningReduce كل قيمة وسيطة. استخدم هذه الدوال لحساب المجاميع والجداءات وإنشاء الخرائط والتجميع والتحويلات خطوةً بخطوة.

الأسئلة الشائعة

هل درس «‏fold وreduce وrunningFold» مجاني؟

نعم — نص درس «‏fold وreduce وrunningFold» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.

ماذا ستتعلم في «‏fold وreduce وrunningFold»؟

اجمع عناصر المجموعات باستخدام fold وreduce ودوال التراكم. تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟

لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «‏fold وreduce وrunningFold»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟

نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ‏map وflatMap: تحويل كل عنصر
  2. ‏filter وfilterNot وpartition
  3. ‏fold وreduce وrunningFold
  4. سلسلة مسارات المعالجة وتجنّب القوائم الوسيطة باستخدام Sequence
← العودة إلى Kotlin Academy