العمل مع قوائم انتظار المهام في Kotlin: دليل شامل للمبتدئين
قوائم انتظار المهام هي إحدى هياكل البيانات الأساسية التي يواجهها كل مطور. في لغة Kotlin، يتم تنفيذ العمل مع قوائم الانتظار من خلال مكتبة المجموعات القياسية، مما يجعل استخدامها بسيطًا وبديهيًا. في هذه المقالة، سنشرح بالتفصيل ما هي قوائم الانتظار، وما هي أنواع قوائم الانتظار الموجودة في Kotlin، وكيفية تطبيقها عمليًا. المادة موجهة للمطورين المبتدئين الذين هم على دراية بأساسيات بناء جملة Kotlin.
ما هي قائمة انتظار المهام ولماذا نحتاجها؟
قائمة الانتظار (Queue) هي بنية بيانات تعمل وفق مبدأ FIFO (First In, First Out - "من يدخل أولاً يخرج أولاً"). تخيل طابورًا في متجر: أول عميل يقف في الطابور يتم خدمته أولاً. في البرمجة، تُستخدم قوائم الانتظار لتنظيم المعالجة المتسلسلة للبيانات: المهام، طلبات الخادم، عمليات الإدخال والإخراج، الرسائل في تطبيقات المراسلة - كل هذا غالبًا ما يتم تنفيذه من خلال قوائم الانتظار.
في Kotlin، يتم تمثيل قائمة الانتظار بواسطة الواجهة Queue<T>، والتي ترث من Collection<T>. الطرق الأساسية لقائمة الانتظار:
add(element)- يضيف عنصرًا إلى نهاية قائمة الانتظار (يطرح استثناءً إذا كانت قائمة الانتظار ممتلئة)؛offer(element)- يضيف عنصرًا إلى نهاية قائمة الانتظار (يعيدtrueعند النجاح،falseعند الفشل)؛remove()- يزيل ويعيد العنصر الأول من قائمة الانتظار (يطرح استثناءً إذا كانت قائمة الانتظار فارغة)؛poll()- يزيل ويعيد العنصر الأول (يعيدnullإذا كانت قائمة الانتظار فارغة)؛element()- يعيد العنصر الأول دون إزالته (استثناء إذا كانت قائمة الانتظار فارغة)؛peek()- يعيد العنصر الأول دون إزالته (يعيدnullإذا كانت قائمة الانتظار فارغة).
يوصى باستخدام offer() و poll() بدلاً من add() و remove()، لأنها لا تطرح استثناءات وتجعل الكود أكثر أمانًا.
التنفيذات الأساسية لقوائم الانتظار في Kotlin
توفر Kotlin (مثل Java) عدة تنفيذات لواجهة Queue. دعنا نستعرض أشهرها.
1. LinkedList كقائمة انتظار
الصنف LinkedList<T> ينفذ واجهة Queue وهو قائمة انتظار كلاسيكية ثنائية الاتجاه. وهو مناسب لمعظم المهام التي لا تتطلب قيودًا صارمة على الأداء.
import java.util.LinkedList
fun main() { val queue: Queue<String> = LinkedList() // نضيف المهام إلى قائمة الانتظار queue.offer("المهمة 1: تحليل HTML") queue.offer("المهمة 2: إرسال البريد الإلكتروني") queue.offer("المهمة 3: الحفظ في قاعدة البيانات") println("قائمة الانتظار الحالية: $queue") // نعالج المهام while (queue.isNotEmpty()) { val task = queue.poll() println("جارٍ المعالجة: $task") } println("تمت معالجة جميع المهام. قائمة الانتظار فارغة: ${queue.isEmpty()}")}يقوم هذا الكود بإنشاء قائمة انتظار من السلاسل النصية، ويضيف ثلاث مهام، ثم يستخرجها ويعرضها بالتسلسل. لاحظ: يتم عرض المهام بنفس الترتيب الذي تمت إضافتها به - وهذا هو مبدأ FIFO.
2. ArrayDeque - بديل عالي الأداء
ArrayDeque<T> هو تنفيذ لقائمة انتظار ثنائية الاتجاه تعتمد على مصفوفة. إنه يعمل بشكل أسرع من LinkedList في معظم العمليات ويستخدم ذاكرة أقل. إذا لم تكن بحاجة إلى قائمة انتظار ثنائية الاتجاه (Deque)، يمكنك استخدام ArrayDeque كقائمة انتظار عادية.
import java.util.ArrayDeque
fun main() { val taskQueue: Queue<Int> = ArrayDeque() // نضيف معرفات المهام for (i