0Pricing
Kotlin Academy · درس

‏map وflatMap: تحويل كل عنصر

حوّل المجموعات باستخدام map وبسّط النتائج المتداخلة باستخدام flatMap.

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

أساسيات التحويل

تطبّق map دالةً على كل عنصر، وتُرجع مجموعة جديدة بالحجم نفسه. وتفعل flatMap الشيء نفسه، لكنها تفرد القوائم المتداخلة في قائمة واحدة.

map الأساسية

حوّل كل عنصر باستخدام لامبدا؛ وستكون النتيجة بالحجم نفسه الذي يحمله الإدخال.

fun main() {
    val nums = listOf(1, 2, 3, 4)
    val squares = nums.map { it * it }
    println(squares) // [1, 4, 9, 16]
}

تغيّر map النوع

يمكن أن يختلف نوع عناصر الناتج عن نوع عناصر الإدخال، إذ يمكن أن تتحول List<Int> إلى List<String>.

fun main() {
    val nums = listOf(1, 2, 3)
    val labels = nums.map { "Item $it" }
    println(labels)
}

استخدام map مع فئة بيانات

استخرج خاصيةً من كل عنصر، وحوّل فئات البيانات إلى أنواع أبسط.

data class User(val name: String, val age: Int)
fun main() {
    val users = listOf(User("Ada", 35), User("Ben", 22))
    val names = users.map { it.name }
    println(names) // [Ada, Ben]
}

تسلسل استدعاءات map

تتألف استدعاءات map المتعددة بسلاسة، إذ يحوّل كل استدعاء ناتج الاستدعاء السابق.

fun main() {
    val nums = listOf(1, 2, 3)
    val result = nums.map { it + 1 }.map { it * 10 }
    println(result) // [20, 30, 40]
}

flatMap الأساسية

تستدعي flatMap دالةً تُرجع قائمة لكل عنصر، ثم تفرد جميع النتائج في قائمة واحدة.

fun main() {
    val words = listOf("hello", "world")
    val chars = words.flatMap { it.toList() }
    println(chars) // [h, e, l, l, o, w, o, r, l, d]
}

متى تستخدم flatMap

استخدم flatMap عندما تُنتج اللامبدا قائمةً بطبيعتها وتريد نتيجة واحدة مسطحة بدلًا من قائمة تحتوي على قوائم.

data class Order(val items: List<String>)
fun main() {
    val orders = listOf(
        Order(listOf("pen", "book")),
        Order(listOf("lamp")),
        Order(listOf("mug", "ring"))
    )
    val allItems = orders.flatMap { it.items }
    println(allItems) // [pen, book, lamp, mug, ring]
}

map للقائمة مقارنةً بـ flatMap

قارن نوعي النتيجة: تحافظ map على التداخل، بينما تزيله flatMap.

fun main() {
    val nums = listOf(1, 2, 3)
    val mapped = nums.map { listOf(it, it * 10) }
    val flat = nums.flatMap { listOf(it, it * 10) }
    println(mapped) // [[1, 10], [2, 20], [3, 30]]
    println(flat)   // [1, 10, 2, 20, 3, 30]
}

flatMap مع القوائم الشرطية

أرجع قوائم فارغة للعناصر التي تريد إسقاطها، إذ تنفذ flatMap التصفية والتحويل في خطوة واحدة.

fun main() {
    val nums = listOf(1, 2, 3, 4, 5)
    val doubled = nums.flatMap { if (it % 2 == 0) listOf(it, it * 2) else emptyList() }
    println(doubled) // [2, 4, 4, 8]
}

map مع الفهرس

توفر mapIndexed كلًا من الفهرس والقيمة إلى اللامبدا.

fun main() {
    val fruits = listOf("apple", "banana", "cherry")
    val labeled = fruits.mapIndexed { i, name -> "$i: $name" }
    println(labeled)
}

Sequence مقارنةً بـ List

في السلاسل الطويلة جدًا من العمليات، حوّل المجموعة أولًا إلى Sequence لتجنب إنشاء قوائم وسيطة.

fun main() {
    val big = (1..100).asSequence()
        .map { it + 1 }
        .filter { it % 5 == 0 }
        .map { it * 2 }
        .toList()
    println(big.take(5)) // first 5 results
}

تحقق سريع

ما الفرق الأساسي بين map وflatMap؟

مراجعة

تحوّل map كل عنصر (بالحجم نفسه، مع احتمال تغيير النوع). وتطبّق flatMap دالةً تُرجع قائمة، ثم تدمج جميع النتائج. ادمجهما مع mapIndexed للحصول على الفهارس، وانتقل إلى Sequence في مسارات المعالجة الكسولة الطويلة.

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

هل درس «‏map وflatMap: تحويل كل عنصر» مجاني؟

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

ماذا ستتعلم في «‏map وflatMap: تحويل كل عنصر»؟

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

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

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

كم من الوقت يستغرق درس «‏map وflatMap: تحويل كل عنصر»؟

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

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

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

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

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