0Pricing
Kotlin Academy · درس

Data Classes في المجموعات ومفاتيح Map

استخدم data classes في المجموعات وخرائط Map بالاستفادة من المساواة البنيوية.

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

فئات البيانات بوصفها كائنات قيم

نظرًا إلى أن فئات البيانات تعيد تعريف equals وhashCode بنيويًا، فهي تعمل بشكل مثالي داخل المجموعات ومفاتيح الخرائط — بخلاف الفئات العادية.

فئة عادية: مفتاح Map غير مناسب

تستخدم الفئة العادية افتراضيًا مساواة المراجع. ويُعد كائنان متشابهان في الشكل مفتاحين مختلفين في Map.
class Key(val id: Int)  // no equals/hashCode
val map = mutableMapOf<Key, String>()
val k1 = Key(1)
val k2 = Key(1)  // same id, different object
map[k1] = "value"
println(map[k2])  // null! k2 != k1 by reference

فئة بيانات: مفتاح Map صحيح

تستخدم فئة البيانات المساواة البنيوية. ويُعد كائنان لهما الخصائص نفسها متساويين.
data class Key(val id: Int)
val map = mutableMapOf<Key, String>()
val k1 = Key(1)
val k2 = Key(1)
map[k1] = "value"
println(map[k2])  // "value"! Equal by value

فئة بيانات داخل Set

تستخدم Sets ‏equals وhashCode لإزالة التكرارات. وتزيل فئات البيانات التكرارات بشكل صحيح.
data class Tag(val name: String)
val tags = mutableSetOf<Tag>()
tags.add(Tag("kotlin"))
tags.add(Tag("kotlin"))  // duplicate
tags.add(Tag("java"))
println(tags.size)  // 2 (not 3)

‏GroupBy مع فئات البيانات

جمّع المجموعات حسب مفتاح من فئة بيانات.
data class Category(val name: String, val parent: String)
val items = listOf(
    "List" to Category("Collections", "stdlib"),
    "Map" to Category("Collections", "stdlib"),
    "Flow" to Category("Coroutines", "kotlinx")
)
val grouped = items.groupBy { it.second }
println(grouped.keys.size)  // 2

عدّ التكرارات باستخدام Map

احسب عدد تكرارات البيانات البنيوية باستخدام فئة بيانات بوصفها مفتاح Map.
data class Pair2(val x: Int, val y: Int)
val points = listOf(Pair2(1,2), Pair2(1,2), Pair2(3,4))
val counts = points.groupingBy { it }.eachCount()
println(counts)  // {Pair2(x=1, y=2)=2, Pair2(x=3, y=4)=1}

فئات البيانات المتداخلة

يمكن لفئات البيانات أن تحتوي على فئات بيانات أخرى. ويكون equals وhashCode عميقين لفئات البيانات المتداخلة.
data class Address(val city: String, val country: String)
data class Person(val name: String, val address: Address)
val p1 = Person("Alice", Address("Berlin", "DE"))
val p2 = Person("Alice", Address("Berlin", "DE"))
println(p1 == p2)  // true

‏sortedBy مع فئات البيانات

رتّب قائمة من مثيلات فئة البيانات حسب إحدى الخصائص.
data class Student(val name: String, val grade: Double)
val students = listOf(
    Student("Bob", 3.2),
    Student("Alice", 3.8),
    Student("Charlie", 2.9)
)
println(students.sortedBy { it.grade })

فئات البيانات والتخزين المؤقت

استخدم فئات البيانات كمفاتيح للتخزين المؤقت في HashMap عندما يكون مفتاح التخزين المؤقت مركبًا.
data class CacheKey(val userId: Long, val resourceType: String)
val cache = HashMap<CacheKey, ByteArray>()
val key = CacheKey(42, "avatar")
cache[key] = byteArrayOf(1, 2, 3)
println(cache[CacheKey(42, "avatar")] != null)  // true

‏distinct على فئات البيانات

تستخدم distinct() على قائمة من فئات البيانات دالة equals الخاصة بها لإزالة التكرارات.
data class Event(val type: String, val ts: Long)
val events = listOf(
    Event("click", 1000),
    Event("click", 1000),  // duplicate
    Event("scroll", 2000)
)
println(events.distinct().size)  // 2

المفاتيح غير القابلة للتغيير أكثر أمانًا

استخدم دائمًا فئات بيانات ذات خصائص val كمفاتيح لـ Map أو Set. ويؤدي تغيير مفتاح بعد إدراجه إلى إفساد بنية البيانات.
data class ImmutableKey(val id: Int)  // val properties only
// DON'T: data class MutableKey(var id: Int)  // changing id breaks map!

تحقق سريع

لماذا تعمل فئات البيانات بشكل صحيح كمفاتيح لـ Map، بينما لا تعمل الفئات العادية كذلك غالبًا؟

مراجعة

تعمل فئات البيانات كمفاتيح لـ Map وعناصر لـ Set لأنها تملك equals وhashCode بنيويين صحيحين. استخدم خصائص val للحفاظ على عدم قابلية المفاتيح للتغيير. واستفد من groupBy وdistinct وsortedBy مع فئات البيانات لإجراء استعلامات قوية.

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

هل درس «Data Classes في المجموعات ومفاتيح Map» مجاني؟

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

ماذا ستتعلم في «Data Classes في المجموعات ومفاتيح Map»؟

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

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

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

كم من الوقت يستغرق درس «Data Classes في المجموعات ومفاتيح Map»؟

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

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

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

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

  1. أساسيات Data Class: الدوال المُنشأة تلقائيًا
  2. النسخ باستخدام copy() والتجاوز الجزئي
  3. تصريحات التفكيك باستخدام componentN
  4. Data Classes في المجموعات ومفاتيح Map
← العودة إلى Kotlin Academy