محتويات الدورة
Kotlin
أسس اللغة والحالة الصريحة
السلوك القابل للاستخدام والحدود المنمطة
التزامن والتكامل والتصميم المترابط

Kotlin / أسس اللغة والحالة الصريحة / الدرس 4

اختيار المجموعات وتحويلها بقصد واضح

استخدم القوائم والمجموعات الفريدة والخرائط ومناظير القراءة والترشيح والتحويل، مع الحفاظ على معنى الترتيب والملكية.

وقت القراءة التقريبي: 5 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • اختر نوع المجموعة وفقا لمتطلبات الترتيب والفريدة والبحث.
  • ميّز واجهة القراءة فقط، واللقطة السطحية، والعناصر القابلة للتعديل التي تشترك فيها عدة مراجع.

اختر علاقة البيانات قبل اختيار العمليات

تحفظ List تسلسلا مفهرسا وتسمح بالعناصر المكررة. وتمثّل Set الفريدة، بينما يعتمد ترتيب المرور على التنفيذ أو عقد دالة الإنشاء المختارة. تربط Map مفاتيح فريدة بقيم، وليست هي نفسها نوعا فرعيا من Collection في Kotlin. اختر وفقا للسؤال: ترتيب التسجيل قائمة، ومعرفات الورش المختارة دون تكرار مجموعة، والبحث عن وصف باستخدام معرف خريطة. لا تحذف القيم المتكررة تلقائيا إذا كان التكرار يحمل معنى تجاريا، كتمثيل عدة مقاعد تتبع الحجز نفسه.

افصل شرط الترشيح عن تحويل القيمة

تحتفظ filter بالعناصر التي تحقق شرطا منطقيا، بينما تحول map كل عنصر إلى نتيجة. في مسار قائمة متحمس التقييم، تنشئ كل عملية عادة مجموعة نتائجها، ولذلك يهم وضوح المسار وكلفة مجموعاته الوسيطة معا. يرشّح المثال سعات الورش المتاحة ويحوّلها إلى تسميات دون تغيير القائمة المدخلة. تشير it في lambda إلى المعامل الوحيد الضمني عندما لا يُسمّى؛ واستخدم اسما صريحا إذا جعل التعشيق أو معنى المجال المرجع ملتبسا. تجنب الآثار الجانبية داخل تحويلات يتوقع القارئ منها وصف تدفق البيانات.

kotlin مسار متحمس للترشيح والتحويل
fun main() {
    val capacities = listOf(0, 3, 1, 0)
    val labels = capacities.filter { seats -> seats > 0 }
        .map { seats -> "available:$seats" }
    println(labels.joinToString("|"))
    println(capacities.size)
}
الناتج المتوقع
available:3|available:1
4

السطران المتوقعان هما available:3|available:1 ثم 4. يحفظ الترشيح الترتيب النسبي للعناصر الباقية، وتظل القائمة الأصلية محتوية على أربعة عناصر. هذا البرنامج لم يُترجم في بيئة التأليف.

قد يرى منظور القراءة تعديل مرجع آخر

تعرض List عمليات القراءة، وتضيف MutableList عمليات التعديل. يضيّق إسناد قائمة قابلة للتعديل إلى مرجع List الواجهة المتاحة، لكنه لا ينسخ الكائن ولا يجمّده؛ فيستطيع مرجع آخر تغييره. تنشئ toList لقطة لقائمة مراجع العناصر، ولا تنسخ العناصر نفسها نسخا عميقا. فإذا كانت العناصر كائنات قابلة للتعديل، فقد تظل القائمتان تريان تغيرها. حدّد هل تعد الدالة بلقطة مستقرة أو منظور حي أو ملكية حصرية، ووثّق ذلك الوعد عند حدها بدلا من استنتاجه من اسم النوع.

لغياب المفتاح وتكراره نتائج مختلفة

يعيد البحث بالأقواس في الخريطة قيمة قابلة للخلو لأن المفتاح قد يكون غائبا. وإذا كان نوع القيم نفسه يسمح بـnull، فلا تكفي نتيجة البحث الخالية للتمييز بين مفتاح موجود بقيمة null ومفتاح غير موجود؛ وتجيب containsKey عن سؤال الوجود. عند إنشاء خريطة بمفاتيح متكررة، تُستبدل القيمة المرتبطة السابقة وفقا لعقد دالة الإنشاء أو العملية، ولا يُحفَظ العنصران كما في قائمة. إذا كانت معرفات العمل المكررة غير صالحة، فتحقق منها صراحة بدلا من ترك إنشاء الخريطة يقرر بصمت أي سجل يبقى.

kotlin مقارنة منظور حي ولقطة ومفتاح غائب
fun main() {
    val mutable = mutableListOf("ws-1")
    val view: List<String> = mutable
    val snapshot = mutable.toList()
    mutable.add("ws-2")
    println(view.size)
    println(snapshot.size)
    val titles = mapOf("ws-1" to "Basics")
    println(titles["missing"] ?: "not found")
}
الناتج المتوقع
2
1
not found

المخرجات المتوقعة هي 2 ثم 1 ثم not found. استُخدمت عناصر نصية حتى لا يعقّد تعديل العناصر نفسها مثال النسخ السطحي. لم يُنفّذ البرنامج، ولا توجد نتيجة تشغيل مرصودة هنا.

عالج المدخل الفارغ والكبير بقصد

تكون المجموعة الفارغة قيمة طبيعية في عمليات كثيرة: تعيد filter وmap نتائج فارغة، ويكون مجموع مجموعة أعداد صحيحة فارغة صفرا. أما first فقد تفشل إذا لم يوجد عنصر، بينما تحفظ firstOrNull احتمال الغياب. لا تحوّل كل عنصر مفقود إلى معرف افتراضي قد يطابق سجلا حقيقيا. قد تصبح كلفة المجموعات الوسيطة المتحمسة مهمة مع البيانات الكبيرة، لكن Sequence ليست أسرع تلقائيا، ويجب فهم دلالات تقييمها عند تقديمها. اختر الصحة وحدود حمل واضحة قبل تحسين شكل مسار التحويل.

الأخطاء الشائعة وإصلاحها

تتغير List يفترض أنها ثابتة بعد إرجاعها.

لماذا يحدث؟
عُرضت MutableList مشتركة عبر مرجع لا يتيح التعديل، لكن بقيت مراجع أخرى تعدّلها.
كيف تصلحه؟
أعد لقطة مناسبة أو وضّح أن القيمة منظور حي مع تحديد مالكها.
كيف تتجنب تكراره؟
اختبر تعديل القائمة عبر المرجع الأصلي بعد إرجاع النتيجة.

تختفي سجلات ذات معرفات متكررة عند بناء الخريطة.

لماذا يحدث؟
استُخدمت بنية تفرض فريدة المفتاح دون التحقق من المدخل المكرر.
كيف تصلحه؟
ارفض التكرار أو اجمع القيم صراحة وفقا لمعنى المجال.
كيف تتجنب تكراره؟
أدرج مدخلا ذا مفتاح مكرر ضمن أمثلة حدود التحويل.

ترمي first استثناء على نتيجة ترشيح فارغة.

لماذا يحدث؟
افترضت الخوارزمية وجود عنصر مطابق دائما.
كيف تصلحه؟
استخدم firstOrNull وعالج الغياب، أو أثبت قيدا يبرر وجود العنصر.
كيف تتجنب تكراره؟
افحص حالة عدم المطابقة إلى جانب المدخلات الاعتيادية.

اختبر فهمك

1. هل تحمي toList الكائنات القابلة للتعديل المخزنة داخل القائمة؟

اعرض الحل المشروح

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

2. تحتوي قائمة التسجيل المتعلم نفسه مرتين لأنه حجز مقعدين. هل ينبغي استخدام toSet لتنظيفها؟

اعرض الحل المشروح

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

أهم ما تعلمته

  • يعبّر اختيار المجموعة عن الترتيب والفريدة ومعنى البحث.
  • القراءة فقط، ونسخ الحاوية، والثبات العميق وعود مختلفة يجب عدم خلطها.

المراجع الرسمية