ما هي مكتبة Kotlin القياسية؟
مكتبة Kotlin القياسية (kotlin-stdlib) هي مجموعة من الوحدات المضمنة في اللغة والتي توفر للمطور حلولاً جاهزة للمهام اليومية. على عكس Java، حيث يجب كتابة العديد من الأشياء يدويًا أو ربط مكتبات خارجية، تقدم Kotlin أدوات مدمجة قوية للعمل مع المجموعات والسلاسل والتدفقات والكوروتينات والتسلسل. المكتبة متوافقة تمامًا مع Java، ولكنها توسع إمكانياتها، مما يجعل الكود أكثر إيجازًا وأمانًا.
الوحدات الرئيسية للمكتبة القياسية
- kotlin-stdlib — جوهر المكتبة: المجموعات، النطاقات (ranges)، التسلسلات (sequences)، الدوال القياسية (let, apply, also, run).
- kotlinx-coroutines — دعم البرمجة غير المتزامنة عبر الكوروتينات.
- kotlinx-serialization — التسلسل/إلغاء التسلسل إلى JSON و Protobuf وتنسيقات أخرى.
- kotlin-test — أدوات اختبار الوحدات.
- kotlin-reflect — الانعكاس (Reflection) والعمل مع الأنواع أثناء وقت التشغيل.
المجموعات والتسلسلات
من أقوى نقاط Kotlin هو العمل مع المجموعات. تقدم المكتبة مجموعات قابلة للتغيير (mutable) وغير قابلة للتغيير (immutable). جميع العمليات الأساسية (التصفية، التحويل، التجميع) مطبقة كدوال امتداد (extension functions).
مثال: العمل مع القوائم
val numbers = listOf(1, 2, 3, 4, 5, 6)val evenSquares = numbers .filter { it % 2 == 0 } .map { it * it } .sortedDescending()println(evenSquares) // [36, 16, 4]في هذا المثال، نستخدم سلسلة من الاستدعاءات: التصفية والتحويل والفرز. يتم تنفيذ جميع العمليات بتكاسل (lazily) حتى لحظة استدعاء العملية النهائية (في هذه الحالة - الطباعة). لمجموعات البيانات الكبيرة، يُوصى باستخدام Sequence.
التسلسلات (Sequences) للحسابات الكسولة
val largeList = (1..1_000_000).toList()val result = largeList.asSequence() .filter { it % 2 == 0 } .map { it * 2 } .take(10) .toList()println(result) // [4, 8, 12, 20, 24, 28, 32, 36, 40]على عكس المجموعات العادية، لا يقوم Sequence بإنشاء قوائم وسيطة، مما يوفر الذاكرة عند العمل مع كميات كبيرة من البيانات.
الكوروتينات: البرمجة غير المتزامنة بدون ألم
وحدة kotlinx-coroutines هي الطريقة القياسية للعمل مع الكود غير المتزامن في Kotlin. تحل محل عمليات الاسترجاع (callbacks) و RxJava، وتوفر بناء جملة تسلسلي بسيط.
مثال بسيط على الكوروتين
import kotlinx.coroutines.*
fun main() = runBlocking { val result = async { delay(1000L) "تم!" } println("انتظار...") println(result.await()) // "تم!" بعد ثانية واحدة}المفاهيم الأساسية:
runBlocking— يحظر (blocks) الخيط الحالي حتى اكتمال الكوروتين (يُستخدم في main).async— يبدأ كوروتين ويعيدDeferred(مشابه لـ Future).await— يوقف (suspends) الكوروتين مؤقتًا حتى الحصول على النتيجة.
التزامن المنظم (Structured Concurrency)
fun main() = runBlocking { launch { repeat(3) { i -> delay(500L) println("المهمة $i اكتملت") } } println("الكوروتين الرئيسي يواصل العمل")}بفضل التزامن المنظم، يتم إنهاء جميع الكوروتينات الفرعية تلقائيًا عند إنهاء الكوروتين الأصلي. هذا يمنع تسرب الذاكرة ويجعل الكود قابلاً للتنبؤ.
تسلسل البيانات (kotlinx.serialization)
تتيح وحدة kotlinx-serialization تحويل كائنات Kotlin إلى JSON و XML و Protobuf وتنسيقات أخرى دون استخدام الانعكاس (reflection). يعمل التسلسل في مرحلة الترجمة، مما يجعله سريعًا وآمنًا.