Scala for Backend Engineering & Functional Programming · درس

الأخذ والتصفية بكسل

قسّم التدفقات اللانهائية

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

الأخذ والتصفية بكسل درس مجاني في Scala for Backend Engineering & Functional Programming على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Scala for Backend Engineering & Functional Programming، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.

الاستهلاك الكسول

تظهر القيمة الحقيقية لـ LazyList عند استهلاكها. تظل العمليات مثل take وfilter وmap كسولة، فلا تحسب إلا الخلايا التي تفرض تقييمها في النهاية.

يغطي هذا الدرس المحوّلات الأساسية وكيفية إيقاف الكسل في اللحظة المناسبة.

take(n)

تعيد take(n) قائمة LazyList تحتوي على أول n عناصر كحد أقصى، وتظل هي نفسها كسولة. لا يُحسب أي شيء حتى تفرض تقييم النتيجة.

إنها الطريقة الآمنة لوضع حد لبث لا نهائي.

object Demo extends App {
  val first5 = LazyList.from(1).take(5)
  println(first5.toList)
}

takeWhile

تعيد takeWhile(p) العناصر ما دام الشرط يتحقق، ثم تتوقف عند أول إخفاق.

في البث اللانهائي، يوفر ذلك شرط توقف واضحًا من دون الحاجة إلى معرفة عدد العناصر.

object Demo extends App {
  val small = LazyList.from(1).takeWhile(_ < 6)
  println(small.toList)
}

drop وdropWhile

تتخطى drop(n) أول n عناصر، بينما تتخطى dropWhile(p) العناصر ما دام الشرط يتحقق. وتعيد كلتاهما الجزء المتبقي بشكل كسول.

استخدمهما للانتقال إلى موضع داخل البث قبل أخذ مقطع منه.

object Demo extends App {
  val rest = LazyList.from(1).drop(3).take(3)
  println(rest.toList)
}

التصفية الكسولة

تكون filter على LazyList كسولة؛ فهي تختبر العناصر فقط عندما يطلبها المستهلك اللاحق.

وعند دمجها مع take، تعالج بالضبط العدد الكافي من عناصر المصدر لتلبية الطلب، ولا شيء أكثر.

object Demo extends App {
  val evens = LazyList.from(1).filter(_ % 2 == 0)
  println(evens.take(4).toList)
}

رؤية الطلب

أضف تعليمة طباعة داخل الشرط لترى قلة العناصر التي يجري اختبارها. لا تعمل التصفية إلا حتى يكتمل طلب take.

شغّل هذا المثال: يوضح عدد الأسطر التي تحتوي على "check" التقييم المعتمد على الطلب، لا تقييم البث كاملًا.

object Demo extends App {
  val r = LazyList.from(1).filter { n =>
    println("check " + n); n % 3 == 0
  }
  println(r.take(2).toList)
}

تسلسل map وfilter

يمكنك تسلسل المحوّلات؛ إذ تظل المسار الكامل كسولًا وتُدمج عملياته لكل عنصر. يمر كل عنصر مصدر عبر map ثم filter فقط عند طلبه.

لا تُنشأ مجموعات وسيطة كاملة.

object Demo extends App {
  val r = LazyList.from(1).map(_ * _).filter(_ > 10).take(3)
  println(r.toList)
}

find: التوقف مبكرًا

تعيد find(p) أول عنصر مطابق ضمن Option، ولا تفرض التقييم إلا حتى الوصول إلى ذلك العنصر. وهي مثالية للبحث في بث لا نهائي.

بمجرد العثور على تطابق، يتوقف التقييم فورًا.

object Demo extends App {
  val firstBig = LazyList.from(1).find(_ * _ > 50)
  println(firstBig)
}

headOption وexists

تتيح headOption الاطلاع بأمان على العنصر الأول، بينما تفرض exists(p) التقييم حتى العثور على تطابق، أو إلى الأبد إذا لم يوجد أي تطابق. استخدم exists مع البثوف اللانهائية فقط عندما يكون وجود تطابق مضمونًا.

تتوقف كلتاهما في أقرب وقت ممكن.

object Demo extends App {
  val has = LazyList.from(1).exists(_ == 7)
  println(has)
}

فرض تقييم النتيجة

تصف المحوّلات الكسولة العمل، أما العملية النهائية فتفرض تنفيذه. تستهلك toList وforeach وsum وfoldLeft البث المحدود وتنتج قيمة ملموسة.

ضع دائمًا حدًا للبث اللانهائي قبل استخدام عملية نهائية تحتاج إلى جميع عناصره.

object Demo extends App {
  val total = LazyList.from(1).take(100).sum
  println(total)
}

مشكلات التصفية

تحوّل filter التي لا تطابق أي عنصر عملية take المحدودة إلى بحث لا نهائي. فالتعبير LazyList.from(1).filter(_ < 0).take(1) لن ينتهي أبدًا.

تأكد من إمكانية تحقيق الشروط، أو اقرن التصفية مع takeWhile لضمان انتهاء التنفيذ.

اختبار سريع

تحقق من فهمك للاستهلاك الكسول.

مراجعة

تظل take وtakeWhile وdrop وfilter وmap كسولة وتُدمج لكل عنصر؛ بينما تتوقف find وexists وheadOption مبكرًا، وتفرض العمليات النهائية مثل toList وsum تقييم النتيجة.

احذر من عوامل التصفية التي يستحيل تحقيقها في البثوف اللانهائية. يمكنك الآن إنشاء التسلسلات الكسولة واستهلاكها بثقة.

البدء مجانًا

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

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

الدورات
39
الدروس
143

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

هل درس «الأخذ والتصفية بكسل» مجاني؟

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

ماذا ستتعلم في «الأخذ والتصفية بكسل»؟

قسّم التدفقات اللانهائية تتمرن على Scala for Backend Engineering & Functional Programming مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Scala for Backend Engineering & Functional Programming؟

لا تُشترط خبرة سابقة. Scala for Backend Engineering & Functional Programming على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «الأخذ والتصفية بكسل»؟

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

هل يمكنني كتابة وتشغيل أكواد في درس Scala for Backend Engineering & Functional Programming هذا؟

نعم. كل درس في Scala for Backend Engineering & Functional Programming يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

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

  1. شرح الكسلية
  2. إنشاء LazyList
  3. التدفقات اللانهائية
  4. الأخذ والتصفية بكسل
← العودة إلى Scala for Backend Engineering & Functional Programming