🤔 ما هي طريقة forEach؟
forEach هي طريقة (method) متاحة في العديد من المجموعات (Collections) في جافا، مثل ArrayList و HashSet و HashMap. وظيفتها الأساسية هي التكرار على كل عنصر داخل المجموعة وتنفيذ إجراء محدد عليه.
فكر فيها كـ "جولة إرشادية" داخل متحف (المجموعة). المرشد (forEach) يأخذك لترى كل قطعة فنية (العنصر) واحدة تلو الأخرى، ويمكنك أن تقوم بإجراء عند رؤية كل قطعة، مثل قراءة لوحتها التعريفية (طباعة العنصر).
⚙️ البنية الأساسية لـ forEach
تعمل forEach مع تعبيرات لامدا (Lambda Expressions)، وهي طريقة مختصرة لكتابة الكود. لا تقلق، سنشرحها بأبسط شكل ممكن هنا.
البنية العامة تبدو كالتالي:
nameOfCollection.forEach(element -> {
// الكود الذي تريد تنفيذه على كل 'عنصر'
});
nameOfCollection: هو متغير الـArrayListأو أي مجموعة أخرى لدينا.forEach: هي الطريقة التي نستدعيها.element: هذا اسم نختاره ليمثل العنصر الحالي الذي يتم التكرار عليه في هذه اللحظة. يمكنك تسميتهitemأوxأوnameأو أي شيء.->: هذه السهم هي جزء من صيغة لامدا، ويمكن قراءتها على أنها "ينفذ".{ }: بداخل الأقواس نضع الإجراء الذي نريد تنفيذه لكل عنصر.
📝 مثال عملي بسيط: طباعة قائمة أسماء
لنطبق ما تعلمناه. لنفترض أن لدينا ArrayList لتخزين أسماء بعض الفواكه ونريد طباعة كل اسم.
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
// 1. إنشاء قائمة الفواكه
ArrayList<String> fruits = new ArrayList<>();
fruits.add("تفاح");
fruits.add("موز");
fruits.add("برتقال");
// 2. استخدام forEach لطباعة كل فاكهة
System.out.println("قائمة الفواكه:");
fruits.forEach(fruit -> {
System.out.println(" - " + fruit);
});
}
}
النتيجة:
قائمة الفواكه:
- تفاح
- موز
- برتقال
شرح المثال:
- أنشأنا قائمة
fruitsوأضفنا إليها ثلاثة عناصر. - استدعينا
fruits.forEach(). - اخترنا اسم
fruitليمثل العنصر الحالي في كل دورة. - الإجراء الذي طلبنا تنفيذه لكل
fruitهو: طباعته مسبوقاً بشرطة.
🎯 مثال آخر: حساب مجموع الأعداد
لنرى كيف نتعامل مع قائمة من الأرقام. سنقوم بجمع جميع الأعداد في قائمة.
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(5);
numbers.add(10);
numbers.add(15);
// سنحتاج متغير خارج نطاق اللامدا لحفظ المجموع
int sum = 0;
numbers.forEach(number -> {
// خطأ! لا يمكننا تعديل 'sum' هنا بهذه الطريقة لأنها يجب أن تكون 'final' أو 'effectively final'
// sum = sum + number; // هذا سيتسبب في خطأ
});
}
}
لحظة! لاحظنا مشكلة. داخل تعبير اللامدا (number -> {...})، لا يمكننا تعديل متغير عادي (sum) تم تعريفه خارجها مباشرة، إلا إذا كان final. لحل هذا، توفر جافا أنواعاً خاصة مثل AtomicInteger، ولكن لتجنب التعقيد الآن، دعنا نستخدم حلقة for العادية لهذا النوع من المهام التي تحتاج لتعديل متغير خارجي.
هذا المثال يوضح نقطة مهمة: forEach رائعة للإجراءات البسيطة والمباشرة على كل عنصر (مثل الطباعة أو استدعاء دالة)، ولكن للحسابات التي تحتاج تجميعاً أو تعديلاً لمتغير خارجي، قد تكون الحلقات التقليدية أوفى في هذه المرحلة.
✅ متى نستخدم forEach؟
- للطباعة: عرض جميع عناصر المجموعة.
- للتعديل البسيط: مثل تحويل كل عنصر إلى أحرف كبيرة (لكن انتبه،
forEachلا يعدل القائمة الأصلية مباشرة بهذه السهولة، سنتعلم طرقاً أخرى لذلك لاحقاً). - لتنفيذ إجراء: مثل استدعاء دالة
sendEmail()لكل عميل في قائمة.
⚠️ ملاحظات هامة للمبتدئين
forEachلا تستخدم للعودة (return) باكراً من التكرار أو كسر (break) الحلقة. إذا احتجت لهذه الميزات، استخدم الحلقةforالتقليدية.- هي جزء من نظام Stream API القوي في جافا، والذي سنتعرف عليه لاحقاً.
- التركيبة
element -> System.out.println(element)يمكن كتابتها بشكل أقصر في حالة وجود جملة واحدة:element -> System.out.println(element)، أو حتى باستخدام مرجع الدالة (Method Reference) هكذا:System.out::println. لا تقلق، سنصل إلى هذه التفاصيل الجميلة في الوقت المناسب.
🧩 خلاصة الدرس
تعلمنا اليوم forEach، وهي أداة أنيقة وموجزة للتكرار على عناصر المجموعات في جافا وتنفيذ إجراء محدد على كل منها. تذكر أنها مثالية للمهام البسيطة والمباشرة. 🎉
🎓 اختبر نفسك
التعليقات
شاركنا رأيك أو أسئلتك حول هذا المقال