Kotlin Academy · درس

العمليات الكسولة

تجنّبوا القوائم الوسيطة

الدرس 3 من 413 خطوة

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

العمليات الكسولة

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

من دون قوائم وسيطة

مع المجموعات، تنشئ كل من map وfilter قائمة جديدة. أما مع التسلسلات، فتمر العناصر عبر جميع الخطوات من دون إنشاء تلك القوائم المؤقتة.

fun main() {
    val result = (1..6).asSequence()
        .map { it * it }
        .filter { it % 2 == 0 }
        .toList()
    println(result)
}

ملاحظة الكسل

من دون عملية نهائية، لا تُنفَّذ أي من دوال لامبدا. يظل مسار المعالجة مجرد وصفة إلى أن يتم استهلاكه.

fun main() {
    val pipeline = (1..3).asSequence()
        .map { println("map $it"); it }
    println("Built pipeline, nothing ran")
    pipeline.toList()
}

تحدّ take العمل

تُعدّ take(n) عملية وسيطة كسولة. وعند دمجها مع مولّد لا نهائي، تتوقف بعد إنتاج عدد n من العناصر.

fun main() {
    val firstThree = generateSequence(1) { it + 1 }
        .map { it * 10 }
        .take(3)
        .toList()
    println(firstThree)
}

تُنهي first التنفيذ مبكرًا

تتوقف العمليات النهائية مثل first بمجرد حصولها على ما تحتاج إليه، وتتجاوز بقية العناصر بالكامل.

fun main() {
    val result = (1..1000).asSequence()
        .map { println("processing $it"); it }
        .first { it > 3 }
    println("Found $result")
}

المعالجة لكل عنصر

في التسلسل، يمر العنصر 1 أولًا عبر map ثم filter، ثم يمر العنصر 2، وهكذا. وهذا الترتيب هو ما يتيح الإنهاء المبكر ويتجنب تخزين جميع النتائج مؤقتًا.

fun main() {
    listOf(1, 2, 3, 4).asSequence()
        .filter { println("filter $it"); it % 2 == 0 }
        .map { println("map $it"); it * 10 }
        .toList()
}

takeWhile وdropWhile

تُخرج takeWhile العناصر إلى أن يفشل الشرط؛ أما dropWhile فتتجاوز العناصر الموجودة في البداية ما دام الشرط متحققًا. وكلتاهما كسولتان.

fun main() {
    val nums = generateSequence(1) { it + 1 }
    println(nums.takeWhile { it < 5 }.toList())
}

تجنب الحسابات المهدرة

بما أنه لا يتم تشغيل أي شيء قبل الاستهلاك، وبما أن الاستهلاك قد يتوقف مبكرًا، فلا تُطبَّق التحويلات المكلفة إلا على العناصر التي تصل فعليًا إلى عملية نهائية.

fun main() {
    val result = (1..100).asSequence()
        .map { it * 2 }
        .filter { it > 10 }
        .take(2)
        .toList()
    println(result)
}

إعادة استخدام التسلسلات

يمكن تكرار معظم التسلسلات عدة مرات، إذ يُعاد تشغيل مسار المعالجة في كل مرة. لكن التسلسلات الناتجة من مصادر تُستهلك مرة واحدة، مثل المكرّر، لا يمكن استهلاكها إلا مرة واحدة. لذا انتبه إلى المصدر.

fun main() {
    val seq = sequenceOf(1, 2, 3).map { it * 2 }
    println(seq.toList())
    println(seq.sum())
}

العمليات ذات الحالة والعمليات عديمة الحالة

معظم العمليات عديمة الحالة، أي إنها تعالج عنصرًا واحدًا في كل مرة. لكن بعض العمليات، مثل sorted أو distinct، ذات حالة ويجب أن تخزّن جميع العناصر مؤقتًا أو تفحصها كلها، مما يقلل فائدة الكسل.

fun main() {
    val result = sequenceOf(3, 1, 2, 1).distinct().sorted().toList()
    println(result)
}

مكاسب الكسل

توفر العمليات الكسولة الذاكرة بتجنب القوائم الوسيطة، وتوفر الوقت من خلال الإنهاء المبكر. وكلما زادت كمية البيانات وأصبحت العملية النهائية أكثر انتقائية، زادت الفائدة.

تحقق سريع

متى تُنفَّذ دوال لامبدا في سلسلة العمليات فعليًا؟

مراجعة

تنشئ العمليات الكسولة مسارًا للمعالجة لا يعمل إلا عندما تستهلكه عملية نهائية، مما يتجنب القوائم الوسيطة ويتيح الإنهاء المبكر باستخدام first وtake وtakeWhile. انتبه إلى العمليات ذات الحالة مثل sorted. بعد ذلك ستحدد متى تكون التسلسلات أفضل من المجموعات.

البدء مجانًا

تعلم Kotlin مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
51
الدروس
203

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

هل درس «العمليات الكسولة» مجاني؟

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

ماذا ستتعلم في «العمليات الكسولة»؟

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

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

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

كم من الوقت يستغرق درس «العمليات الكسولة»؟

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

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

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

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

  1. لماذا نستخدم Sequences
  2. إنشاء Sequences
  3. العمليات الكسولة
  4. Sequences مقابل Collections
← العودة إلى Kotlin Academy