التحويلات
map وfilter وflatMap
التحويلات درس مجاني في Scala for Backend Engineering & Functional Programming على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Scala for Backend Engineering & Functional Programming، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.
تحويل المجموعات
تكون مجموعات Scala غير قابلة للتغيير افتراضيًا. وبدلًا من تعديلها، تحوّلونها إلى مجموعات جديدة باستخدام دوال مثل map وfilter وflatMap.
object Main {
def main(args: Array[String]): Unit = {
val nums = List(1, 2, 3, 4)
val doubled = nums.map(_ * 2)
println(nums)
println(doubled)
}
}map: تحويل كل عنصر
تطبّق map دالةً على كل عنصر، وتعيد مجموعة جديدة بالحجم نفسه. وقد يتغير نوع العناصر.
object Main {
def main(args: Array[String]): Unit = {
val words = List("scala", "rocks")
val lengths = words.map(_.length)
println(lengths)
}
}الاختصار باستخدام الشرطة السفلية
تُستخدم الشرطة السفلية _ اختصارًا لمعامل دالة واحد. فتعني _ * 2 التعبير x => x * 2. وهذا يحافظ على إيجاز التحويلات البسيطة.
object Main {
def main(args: Array[String]): Unit = {
val nums = List(10, 20, 30)
println(nums.map(_ + 1))
println(nums.map(x => x + 1))
}
}filter: الاحتفاظ بالعناصر المطابقة
تحتفظ filter بالعناصر التي يعيد المسند لها القيمة true فقط. وقد تكون النتيجة أصغر من الأصلية.
object Main {
def main(args: Array[String]): Unit = {
val nums = (1 to 10).toList
val evens = nums.filter(_ % 2 == 0)
println(evens)
}
}filterNot: العكس
تحتفظ filterNot بالعناصر التي يكون فيها المسند false. وهي متممة filter.
object Main {
def main(args: Array[String]): Unit = {
val nums = List(1, 2, 3, 4, 5)
println(nums.filterNot(_ % 2 == 0))
}
}flatMap: التحويل ثم التسطيح
تطبّق flatMap دالةً تعيد مجموعة لكل عنصر، ثم تسطّح النتائج في مجموعة واحدة.
object Main {
def main(args: Array[String]): Unit = {
val words = List("ab", "cd")
val chars = words.flatMap(_.toList)
println(chars)
}
}map مقارنةً بـ flatMap
إذا كانت دالتكم تعيد مجموعة، فإن map تمنحكم مجموعات متداخلة، بينما تمنحكم flatMap مجموعة مسطّحة. اختاروا الدالة بناءً على البنية التي تريدونها.
object Main {
def main(args: Array[String]): Unit = {
val nums = List(1, 2, 3)
println(nums.map(n => List(n, n)))
println(nums.flatMap(n => List(n, n)))
}
}flatMap مع Option
عند استخدام flatMap على قائمة من قيم Option، تُسقط قيم None وتفك تغليف قيم Some، وهي طريقة مفيدة للتصفية والتحويل في آن واحد.
object Main {
def main(args: Array[String]): Unit = {
val raw = List("1", "x", "3", "y")
val parsed = raw.flatMap(_.toIntOption)
println(parsed)
}
}collect: التصفية والتحويل معًا
تأخذ collect دالة جزئية؛ فتحافظ فقط على العناصر التي تكون الدالة معرّفة لها وتحولها، فتجمع بين filter وmap في مرور واحد.
object Main {
def main(args: Array[String]): Unit = {
val mixed: List[Any] = List(1, "two", 3, "four", 5)
val ints = mixed.collect { case i: Int => i * 10 }
println(ints)
}
}تسلسل التحويلات
بما أن كل دالة تعيد مجموعة جديدة، يمكنكم تسلسلها في مسار واضح القراءة. وتحول كل خطوة مخرجات الخطوة السابقة.
object Main {
def main(args: Array[String]): Unit = {
val result = List(1, 2, 3, 4)
.map(_ + 1)
.filter(_ % 2 == 0)
println(result)
}
}مسار واضح
إليكم مسار تحويل مرتبًا: صفّوا الأعداد الزوجية، ثم ربّعوها، ثم احتفظوا بالكبيرة منها. وتُقرأ المسارات كما لو كانت وصفًا لتدفق البيانات.
object Main {
def main(args: Array[String]): Unit = {
val result = (1 to 10).toList
.filter(_ % 2 == 0)
.map(x => x * x)
.filter(_ > 10)
println(result)
}
}تحقق سريع
ماذا يعيد List("ab", "cd").flatMap(_.toList)؟
مراجعة
لقد تعلّمتم التحويلات الأساسية:
map— تحويل كل عنصر مع الحفاظ على الحجم نفسهfilter/filterNot— الاحتفاظ بالعناصر أو استبعادها وفقًا لدالة شرطيةflatMap— إجراء map ثم تسطيح النتائج المتداخلةcollect— التصفية والتحويل باستخدام دالة جزئية- ربطها في مسارات واضحة وغير قابلة للتغيير
الأسئلة الشائعة
هل درس «التحويلات» مجاني؟
نعم — نص درس «التحويلات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Scala for Backend Engineering & Functional Programming، انتقل إلى CoddyKit PRO. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.
ماذا ستتعلم في «التحويلات»؟
map وfilter وflatMap تتمرن على Scala for Backend Engineering & Functional Programming مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Scala for Backend Engineering & Functional Programming؟
لا تُشترط خبرة سابقة. Scala for Backend Engineering & Functional Programming على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «التحويلات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Scala for Backend Engineering & Functional Programming هذا؟
نعم. كل درس في Scala for Backend Engineering & Functional Programming يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.