Kotlin Academy · درس

سلسلة مسارات المعالجة وتجنّب القوائم الوسيطة باستخدام Sequence

أنشئ مسارات معالجة متعددة الخطوات واستخدم Sequence للتقييم الكسول.

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

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

المشكلة: القوائم الوسيطة

كل عملية على مجموعة، مثل filter وmap، تنشئ قائمة جديدة. ومع المجموعات الكبيرة أو السلاسل الطويلة، يؤدي ذلك إلى هدر الذاكرة والوقت.

التقييم الفوري مقارنةً بالتقييم الكسول

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

التحويل إلى Sequence

استدعِ asSequence() للانتقال من المعالجة الفورية (القائمة) إلى المعالجة الكسولة (التسلسل).
val result = (1..1_000_000)
    .asSequence()
    .filter { it % 2 == 0 }
    .map { it * it }
    .take(5)
    .toList()
println(result)  // [4, 16, 36, 64, 100]

Sequence كسول: لا عمل قبل العملية النهائية

لا يحدث أي حساب حتى تستدعي عاملًا نهائيًا مثل toList أو first أو sum.
val seq = generateSequence(1) { it + 1 }  // infinite!
    .filter { it % 3 == 0 }
    .map { it * it }
val first5 = seq.take(5).toList()
println(first5)  // [9, 36, 81, 144, 225]

generateSequence: تسلسلات لا نهائية

تنشئ generateSequence تسلسلات كسولة لا نهائية.
val fibonacci = generateSequence(Pair(0, 1)) { (a, b) -> Pair(b, a + b) }
    .map { it.first }
val first10 = fibonacci.take(10).toList()
println(first10)  // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

منشئ sequence

ينشئ منشئ sequence { }، مع yield، تسلسلات كسولة مخصصة.
val evens = sequence {
    var n = 0
    while (true) {
        yield(n)
        n += 2
    }
}
println(evens.take(5).toList())  // [0, 2, 4, 6, 8]

متى تستخدم Sequence

استخدم Sequence عندما تكون المجموعة كبيرة (أكثر من 1000 عنصر)، أو تستخدم عدة عمليات متسلسلة، أو تحتاج إلى مجموعة فرعية صغيرة فقط من النتائج.

متى لا تستخدم Sequence

بالنسبة إلى المجموعات الصغيرة (أقل من 100 عنصر)، تضيف Sequence عبئًا إضافيًا. وتكون الآلية المعتمدة على المكرّر أبطأ في السلاسل القصيرة.
// Overkill for small list:
listOf(1, 2, 3).asSequence().map { it * 2 }.toList()
// Just use:
listOf(1, 2, 3).map { it * 2 }

العمليات النهائية في Sequence

تبدأ العمليات النهائية المعالجة. ومن العمليات الشائعة: toList() وfirst() وlast() وcount() وsum() وany() وall() وnone().
val s = (1..100).asSequence().filter { it % 7 == 0 }
println(s.first())          // 7
println(s.count())          // 14
println(s.sum())            // 728

العمليات ذات الحالة وغير ذات الحالة

تحتفظ بعض عمليات Sequence بالحالة، مثل sort وdistinct، إذ يجب أن ترى جميع العناصر قبل إنتاج الناتج. وتؤدي هذه العمليات إلى كسر التقييم الكسول.
val s = (1..10).asSequence()
    .filter { it > 3 }   // stateless: lazy
    .sorted()            // stateful: must see all elements
    .take(3).toList()
println(s)  // [4, 5, 6]

constrainOnce: أمان التكرار لمرة واحدة

استخدم constrainOnce() لجعل التسلسل يطلق استثناءً عند تكراره عدة مرات، وهو أمر مفيد للتدفقات.
val seq = generateSequence(1) { if (it < 5) it + 1 else null }
    .constrainOnce()
val first = seq.toList()   // OK
// val second = seq.toList()  // IllegalStateException!

تحقق سريع

متى تبدأ Sequence في معالجة العناصر؟

مراجعة

تتسم Sequence بالتقييم الكسول، فلا يحدث أي عمل قبل استدعاء عملية نهائية. استخدم asSequence() مع المجموعات الكبيرة التي تتضمن عدة عمليات متسلسلة. ينشئ كل من generateSequence وsequence { } تدفقات كسولة لا نهائية. وتبدأ العمليات النهائية المعالجة.
البدء مجانًا

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

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

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

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

هل درس «سلسلة مسارات المعالجة وتجنّب القوائم الوسيطة باستخدام Sequence» مجاني؟

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

ماذا ستتعلم في «سلسلة مسارات المعالجة وتجنّب القوائم الوسيطة باستخدام Sequence»؟

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

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

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

كم من الوقت يستغرق درس «سلسلة مسارات المعالجة وتجنّب القوائم الوسيطة باستخدام Sequence»؟

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

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

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

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

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