filter وfilterNot وpartition
قسّم العناصر وانتقِ منها باستخدام دوال تعتمد على المسندات.
filter وfilterNot وpartition درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
عمليات الانتقاء
تُبقي filter على العناصر المطابقة لشرط. وتُبقي filterNot على العناصر التي لا تطابقه. أما partition فتقسّم المجموعة إلى قائمتين دفعةً واحدة.
filter الأساسية
تُرجع filter { ... } قائمةً جديدة تحتوي فقط على العناصر التي يكون شرطها صحيحًا.
fun main() {
val nums = listOf(1, 2, 3, 4, 5, 6)
val evens = nums.filter { it % 2 == 0 }
println(evens) // [2, 4, 6]
}filterNot
تمثل filterNot { ... } العملية العكسية: فهي تُبقي على العناصر التي يكون شرطها خاطئًا. وتعطي النتيجة نفسها التي يعطيها عكس الشرط، لكن نيتها أوضح.
fun main() {
val nums = listOf(1, 2, 3, 4, 5, 6)
val odds = nums.filterNot { it % 2 == 0 }
println(odds) // [1, 3, 5]
}partition
تُرجع partition كائن Pair: العناصر المطابقة أولًا، وغير المطابقة ثانيًا. وهذا يتجنب المرور على البيانات مرتين.
fun main() {
val nums = listOf(1, 2, 3, 4, 5, 6)
val (evens, odds) = nums.partition { it % 2 == 0 }
println("evens=$evens odds=$odds")
}partition مع فئة بيانات
قسّم قائمة من السجلات إلى مجموعتين في مرور واحد.
data class User(val name: String, val active: Boolean)
fun main() {
val users = listOf(User("Ada", true), User("Ben", false), User("Cal", true))
val (active, inactive) = users.partition { it.active }
println("active=${active.map { it.name }}")
println("inactive=${inactive.map { it.name }}")
}filterIndexed
يتلقى الشرط كلًا من الفهرس والقيمة، وهو مفيد عندما يكون الموضع مهمًا.
fun main() {
val nums = listOf(10, 20, 30, 40, 50)
val every2nd = nums.filterIndexed { i, _ -> i % 2 == 0 }
println(every2nd) // [10, 30, 50]
}filterIsInstance
أبقِ على العناصر من نوع محدد فقط، مع إجراء التحويلات الذكية للنوع في الداخل.
fun main() {
val mixed: List<Any> = listOf(1, "hello", 2.0, "world", 3)
val onlyStrings = mixed.filterIsInstance<String>()
println(onlyStrings) // [hello, world]
}filterNotNull
أزل الإدخالات الفارغة من قائمة القيم التي قد تكون فارغة، لتحصل على قائمة من العناصر غير الفارغة.
fun main() {
val mixed: List<String?> = listOf("a", null, "b", null, "c")
val nonNull = mixed.filterNotNull()
println(nonNull) // [a, b, c]
}تسلسل filter وmap
ادمج بين filter وmap لإنشاء مسارات تجمع بين الانتقاء والتحويل.
data class Product(val name: String, val price: Double, val inStock: Boolean)
fun main() {
val products = listOf(
Product("Pen", 1.0, true),
Product("Book", 12.0, false),
Product("Lamp", 25.0, true)
)
val availableNames = products.filter { it.inStock }.map { it.name }
println(availableNames) // [Pen, Lamp]
}استخدام filterNot للنفي من أجل الوضوح
في بعض الأحيان تكون قراءة filterNot { it.isActive } أفضل من قراءة filter { !it.isActive }.
data class Task(val title: String, val done: Boolean)
fun main() {
val tasks = listOf(Task("Email", true), Task("Lunch", false), Task("Code", true))
val pending = tasks.filterNot { it.done }
println(pending) // [Task(title=Lunch, done=false)]
}تُرجع partition قوائم
يحتوي Pair الناتج من partition على قائمتين عاديتين، ويمكنك تفكيكهما أو الوصول إليهما عبر .first و.second.
fun main() {
val nums = (1..10).toList()
val result = nums.partition { it > 5 }
println("above 5: ${result.first}")
println("below 6: ${result.second}")
}partition مقارنةً باستدعاء filter مرتين
إذا كنت تحتاج إلى كلتا المجموعتين الفرعيتين، فإن partition أسرع، إذ تنفذ مرورًا واحدًا بدلًا من اثنين.
fun main() {
val nums = (1..10).toList()
// Two passes:
val a = nums.filter { it > 5 }
val b = nums.filter { it <= 5 }
// One pass:
val (c, d) = nums.partition { it > 5 }
println("$a $b")
println("$c $d")
}تحقق سريع
أي دالة تُرجع العناصر المطابقة وغير المطابقة معًا في مرور واحد؟
مراجعة
تنتقي filter العناصر المطابقة، وتنتقي filterNot العناصر غير المطابقة، بينما تُرجع partition المجموعتين في مرور واحد. استخدم filterIsInstance للإبقاء على العناصر من نوع معين، و< b>filterNotNull لإسقاط القيم الفارغة. ادمجها مع map لتنفيذ الانتقاء والتحويل معًا.
تعلم Kotlin مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 51
- الدروس
- 203
الأسئلة الشائعة
هل درس «filter وfilterNot وpartition» مجاني؟
نعم — نص درس «filter وfilterNot وpartition» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
ماذا ستتعلم في «filter وfilterNot وpartition»؟
قسّم العناصر وانتقِ منها باستخدام دوال تعتمد على المسندات. تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟
لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «filter وfilterNot وpartition»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟
نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- map وflatMap: تحويل كل عنصر
- filter وfilterNot وpartition
- fold وreduce وrunningFold
- سلسلة مسارات المعالجة وتجنّب القوائم الوسيطة باستخدام Sequence