Lambda في Java
مرّر إجراءً قصيراً إلى forEach بسهم. في Cue.java أبقِ الفئة العامة Cue، استورد java.util.ArrayList، خزّن "oak" في قائمة مُنمّطة، واستدعِ names.forEach(n -> System.out.println(n));. جمّع بـjavac Cue.java وشغّل java Cue. يجب أن تعرض الشاشة oak. عرض ثانٍ يضيف "pine" فتعرض الشاشة oak ثم pine. اترك Streams الاختياري للصفحة التالية. هذا الدرس lambda يُمرَّر إلى forEach، وليس عرض Generics لـget(0) وليست وسائط سطر الأوامر args.
عنصر واحد، طباعة lambda واحدة
افتح Cue.java. أبقِ اسم الفئة العامة Cue. احذف عروض Bin generics المتبقية، وتشغيلات وسائط البرنامج Flag المتبقية، ومطالبات Box Scanner المتبقية، وتاريخ Shelf المتبقي إن دفن قصة lambda. البرنامج لا ينبغي أن ينتظر كتابة ولا يتطلب كلمات تشغيل.
أضف الاستيراد في الأعلى:
import java.util.ArrayList;
داخل Cue.main ابنِ قائمة مُنمّطة، أضف كلمة واحدة، ومرّر lambda إلى forEach:
ArrayList<String> names = new ArrayList<>();
names.add("oak");
names.forEach(n -> System.out.println(n));
الجزء n -> System.out.println(n) هو lambda. n اسم المعامل لعنصر واحد. السهم -> يشير إلى الجسم الذي يُنفَّذ لذلك العنصر. forEach يستدعي ذلك الجسم مرة لـ"oak". تعرض الشاشة oak.
import java.util.ArrayList;
public class Cue {
public static void main(String[] args) {
ArrayList<String> names = new ArrayList<>();
names.add("oak");
names.forEach(n -> System.out.println(n));
}
}
من المجلد الذي يحتوي Cue.java شغّل javac Cue.java. عندما تتطابق الأقواس والفواصل المنقوطة، لا يطبع javac سطراً خاصاً به. ثم شغّل java Cue — وليس java Cue.java. أبقِ فئة عامة واحدة ليطابق الاسم Cue.
امشِ التشغيل مرة. Java تبدأ عند Cue.main. القائمة تحمل "oak". forEach تأخذ lambda. للعنصر الأول (والوحيد) يكون n هو "oak" وprintln يكتب oak. لا شيء يستدعي get(0) في شكل التعليم هذا. لا شيء يطبع 3 من عرض Integer في Bin. لا شيء يقرأ args[0].
قل قاعدة المبتدئ وأنت تراقب الشاشة: forEach تمشي القائمة؛ lambda هو الإجراء لكل عنصر؛ السهم يفصل المعامل عن الجسم. لا تخترع خطوط Streams على هذه الصفحة. Streams ينتظر الدرس الاختياري التالي. لا تستبدل lambda بأسماء دالة كاملة في ملف التعليم هذا — أبقِ صيغة السهم.
إن بقيت ترى oak فقط من names.get(0) في ملف Bin متبقٍ، انتقل إلى Cue وأبقِ سطر forEach. إن رفض javac السهم، تحقق أنك كتبت -> وأن lambda داخل forEach(...).
عنصران، نفس lambda
أبقِ نفس الفئة العامة Cue. أضف كلمة ثانية قبل forEach:
names.add("oak");
names.add("pine");
names.forEach(n -> System.out.println(n));
جمّع مجدداً بـjavac Cue.java وشغّل java Cue. تعرض الشاشة oak ثم pine. forEach يشغّل lambda مرة لكل عنصر بالترتيب. جسم lambda لا يتغير. طول القائمة فقط هو الذي تغيّر.
import java.util.ArrayList;
public class Cue {
public static void main(String[] args) {
ArrayList<String> names = new ArrayList<>();
names.add("oak");
names.add("pine");
names.forEach(n -> System.out.println(n));
}
}
امشِ التشغيل مرة. استدعاء أول: n هو "oak"، اطبع oak. استدعاء ثانٍ: n هو "pine"، اطبع pine. أبقِ العرضين كشكلين تعليميين. أولاً أثبت طباعة lambda بكلمة واحدة. ثم أثبت نفس lambda على عنصرين. يشترك الشكلان في الاستيراد والقائمة المُنمّطة وn -> System.out.println(n).
إن طبعت القائمة كاملة بـprintln(names) بدل forEach، ترى أقواساً وفواصل — عادة مختلفة. هذه الصفحة تبقي طباعة واحدة لكل عنصر عبر lambda.
Lambda ليست Generics فقط وليست Streams
Generics سمّت نوع العنصر في ArrayList<String>. Lambda يعطي forEach إجراءً قصيراً بلا كتابة أسماء دالة منفصلة على هذه الصفحة. Streams سيربط خطوات قائمة أكثر في صفحة اختيارية لاحقة. لا تخلط هذه المهام الثلاث في ملف مبتدئ واحد اليوم.
oak هنا عنصر قائمة يزوره forEach. ليس args[0] من Flag وليس إجابة Scanner. عندما يبقى ملف Bin يطبع get(0) فقط، اتركه كتاريخ وأبقِ سطر forEach في Cue. عندما يبقى ملف Flag يحتاج java Flag oak، اترك عادة التشغيل تلك جانباً وشغّل java Cue العادي.
بلا السهم، لا يستطيع javac معاملة الإجراء كـlambda. بلا forEach، لا مكان لتشغيل lambda في شكل التعليم هذا. أبقِ القطعتين معاً أثناء التمرين. أبقِ صيغة Streams مثل .stream().map خارج هذه الصفحة حتى ذلك الدرس، حتى لو رأيت كلمة Stream في عنوان آخر.
فحوص المجلد قبل Streams
اعرض المجلد بعد تجميع ناجح. يجب أن ترى Cue.java وCue.class معاً. عدّل المصدر، احفظ، شغّل javac Cue.java، ثم java Cue. ملف .class قديم قد يعرض شاشة سطر واحد قديمة إن تخطيت التجميع بعد إضافة "pine".
إن اشتكى javac من فئات عامة مكررة، أبقِ Cue فقط عامة. إن أظهرت الشاشة [oak, pine] في سطر واحد، طبعت كائن القائمة — عد إلى forEach مع println داخل lambda. إن لم يطبع شيء، تأكد أن add نفذ قبل forEach.
لا تلصق get(0) من Bin كبديل للـlambda على هذه الصفحة. لا تلصق كلمات تشغيل Flag في أمر التشغيل. المهمة الاختيارية للـlambda هي forEach مع جسم بسهم.
قبل Streams الاختياري
يمكنك أن تبقي الفئة العامة Cue، وتستورد ArrayList، وتضيف "oak"، وتستدعي names.forEach(n -> System.out.println(n));، وترى oak، ثم تضيف "pine" وترى oak ثم pine. جمّع بـjavac Cue.java وشغّل java Cue. الصفحة الاختيارية التالية هي Streams.
أبقِ عروض Cue لزوج lambda واضح. أبقِ ملفات generics لـBin خارج هذه الصفحة عند تمرين forEach. أبقِ ملفات وسائط Flag خارج هذه الصفحة عند تمرين forEach. أبقِ عمل Streams خارج هذه الصفحة حتى ذلك الدرس. هذه العادات نقطة تفتيش قبل المتابعة. عندما تعرض شاشة كلمة واحدة oak أو شاشة كلمتين oak ثم pine، أنجزت Lambda عملها لهذا الدرس وأنت جاهز لـStreams إن واصلت المسار الاختياري.
مرّة أخيرة على المجلد: Cue عامة واحدة، الاستيراد حاضر، ArrayList<String> مُنمّط، forEach مع n -> System.out.println(n)، بلا انتظار Scanner، بلا كلمات تشغيل مطلوبة. شغّل javac Cue.java وjava Cue مرة أخرى على العرض المفتوح. إن بقيت الشاشة تعرض oak أو oak ثم pine، شكل Lambda متين ويمكن للدورة الانتقال إلى Streams الاختياري في الصفحة التالية. فضّل عادة forEach واضحة في كل قراءة ليعلّم كل مرور نفس الخريطة.
🧠 اختبر معرفتك
اختبر معرفتك
تحدى نفسك مع هذا الاختبار التفاعلي واكتشف مدى فهمك للموضوع
📝 التعليمات
- اقرأ كل سؤال بعناية
- اختر أفضل إجابة لكل سؤال
- يمكنك إعادة الاختبار عدة مرات كما تريد
- سيتم عرض تقدمك في الأعلى