ربط Map و Filter و Reduce
جزء من قسم المنطق والتدفق في رحلة Swift على Coddy. الدرس 26 من 56.
تكمن القوة الحقيقية لهذه الأساليب الثلاثة في أنها تتكامل معًا. إذ تعمل كل خطوة على تحويل البيانات وتمريرها إلى الخطوة التالية.
let nums = [1, 2, 3, 4, 5, 6]
let result = nums
.filter { $0 % 2 == 0 } // [2, 4, 6]
.map { $0 * $0 } // [4, 16, 36]
.reduce(0, +) // 56
print(result) // 56بالقراءة من الأعلى إلى الأسفل: احتفظ بالأعداد الزوجية، وربّعها، واجمع مربعاتها. كل خطوة هي أمر واضح واحد، وتظل السلسلة سهلة القراءة حتى مع نموّها.
يستبدل شكل خط الأنابيب هذا حلقةً مكتوبةً يدويًا بنيةً صريحة. تقول filter "select". تقول map "transform". تقول reduce "collapse".
يمكن للقارئ فحص السلسلة ومعرفة ما يحدث دون تتبّع متغيرات الفهرسة.
قاعدة سريعة: الترتيب مهم. إجراء التصفية قبل التحويل يتطلب عملاً أقل من إجراء التحويل قبل التصفية عندما تكون التصفية انتقائية.
التحدي
متوسطاقرأ سطرًا واحدًا من الإدخال: قائمة مفصولة بفواصل من أزواج price:quantity. على سبيل المثال، 3:2,5:1,2:4,7:0 تعني أربعة طلبات.
لكل طلب تكون فيه quantity > 0، يكون إجمالي السطر هو price * quantity. اطبع ثلاثة أسطر:
- إجماليات الأسطر (للطلبات التي يكون فيها
quantity > 0فقط)، مفصولة باستخدام, - الإجمالي الكلي لإجماليات تلك الأسطر
- عدد الطلبات التي ساهمت (أي التي تكون فيها quantity أكبر من الصفر)
أنشئ مسار المعالجة باستخدام filter متبوعًا بـ map، ثم اشتق count وsum من result.
بالنسبة إلى الإدخال 3:2,5:1,2:4,7:0، يكون الناتج:
6,5,8
19
3جرّب بنفسك
let orders = readLine()!.components(separatedBy: ",").map { pair -> (Int, Int) in
let parts = pair.components(separatedBy: ":")
return (Int(parts[0])!, Int(parts[1])!)
}
// TODO: صفِّ الكمية > 0، حوّل إلى إجماليات الأسطر؛ اطبع المدموج، المجموع، العدد
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق والتدفق
1النصوص بعمق
العد والفهارسحالة الأحرف وإزالة الفراغاتالبحث في النصوصتقسيم ودمج النصوصاستبدال النصوص الفرعيةمراجعة - التحقق من اسم المستخدم4المجموعات
إنشاء المجموعاتالاتحاد والتقاطعالطرح والفرق المتماثلالمجموعات الجزئية والشاملةمراجعة - تصفية الـ Tag7مشروع - متتبع العادات
نظرة عامة على المشروعتحديد كمكتمل2النطاقات والخطوات
المغلقة مقابل نصف المفتوحةالخطوة (Stride)دوال النطاقاتالنطاقات في Switchملخص - شبكة التقويم5الدوال من الرتبة العليا - الجزء الأول
MapFilterReduceربط Map و Filter و Reduceمراجعة - إحصائيات الكلماتتدرّب بنفسك: Playground لـ Swift