Streams في Java
ابدأ أنبوباً من قائمة بـstream()، أبقِ العناصر أو غيّرها، ثم اطبع. في Pipe.java أبقِ الفئة العامة Pipe، استورد java.util.ArrayList، خزّن "oak" و"pine"، واستدعِ names.stream().filter(n -> n.startsWith("o")).forEach(n -> System.out.println(n));. جمّع بـjavac Pipe.java وشغّل java Pipe. يجب أن تعرض الشاشة oak. عرض ثانٍ يستخدم map فتعرض الشاشة OAK، ثم PINE. اترك Records الاختياري للصفحة التالية. هذا الدرس أنبوب stream، وليس forEach عادياً على القائمة وليس عرض Generics لـget(0).
تصفية كلمة مطابقة واحدة
افتح Pipe.java. أبقِ اسم الفئة العامة Pipe. احذف عروض Cue lambda فقط المتبقية، وطباعات Bin generics المتبقية، وتشغيلات وسائط البرنامج Flag المتبقية، ومطالبات Box Scanner المتبقية إن دفنت قصة streams. البرنامج لا ينبغي أن ينتظر كتابة ولا يتطلب كلمات تشغيل.
أضف الاستيراد في الأعلى:
import java.util.ArrayList;
داخل Pipe.main، ابنِ قائمة مُنمّطة بكلمتين، ثم ابدأ stream يبقي الكلمات التي تبدأ بـo:
ArrayList<String> names = new ArrayList<>();
names.add("oak");
names.add("pine");
names.stream().filter(n -> n.startsWith("o")).forEach(n -> System.out.println(n));
stream() يفتح الأنبوب. filter يبقي العناصر التي يعيد lambda الخاص بها true. forEach يطبع كل عنصر محفوظ. "oak" تبدأ بـo. "pine" لا تبدأ. الشاشة تعرض oak.
import java.util.ArrayList;
public class Pipe {
public static void main(String[] args) {
ArrayList<String> names = new ArrayList<>();
names.add("oak");
names.add("pine");
names.stream().filter(n -> n.startsWith("o")).forEach(n -> System.out.println(n));
}
}
من المجلد الذي يحوي Pipe.java، شغّل javac Pipe.java. عندما تتطابق الأقواس والفواصل المنقوطة، لا يكتب javac سطراً خاصاً به. ثم شغّل java Pipe — وليس java Pipe.java. أبقِ فئة عامة واحدة ليتطابق الاسم مع Pipe.
امشِ التشغيل مرة. Java تبدأ عند Pipe.main. القائمة تحوي "oak" و"pine". stream() يبدأ. filter يبقي "oak". forEach يطبع oak. لا شيء يطبع الكلمتين معاً. لا شيء يستدعي فقط names.forEach بلا stream(). لا شيء يقرأ args[0].
قل قاعدة المبتدئ وأنت تراقب الشاشة: stream() يبدأ الأنبوب؛ filter يختار؛ forEach ينهي بطباعة جانبية. لا تخترع عروض Records على هذه الصفحة. Records ينتظر الدرس الاختياري التالي. لا تحذف stream() وتتوقع أن filter يتعلق بالقائمة نفسها في هذا الشكل التعليمي.
إن ما زالت الشاشة تعرض oak ثم pine من ملف Cue forEach متبقي، انتقل إلى Pipe وأبقِ خطوة filter. إن رفض javac stream، تأكد أن نوع القائمة ArrayList والاستدعاء names.stream().
map لكل كلمة إلى أحرف كبيرة
أبقِ نفس الفئة العامة Pipe. غيّر الأنبوب ليحوّل كل كلمة بدل التصفية:
names.stream().map(n -> n.toUpperCase()).forEach(n -> System.out.println(n));
أبقِ "oak" و"pine" في القائمة. جمّع مرة أخرى بـjavac Pipe.java وشغّل java Pipe. الشاشة تعرض OAK، ثم PINE. map يعيد قيمة جديدة لكل عنصر. forEach يطبع تلك القيم بالترتيب.
import java.util.ArrayList;
public class Pipe {
public static void main(String[] args) {
ArrayList<String> names = new ArrayList<>();
names.add("oak");
names.add("pine");
names.stream().map(n -> n.toUpperCase()).forEach(n -> System.out.println(n));
}
}
امشِ التشغيل مرة. أول قيمة بعد map هي OAK. الثانية PINE. أبقِ العرضين كشكلين تعليميين. أولاً أثبت أن filter يبقي كلمة واحدة. ثم أثبت أن map يغيّر كل كلمة. يتشاركان الاستيراد والقائمة المُنمّطة وstream() وforEach نهائياً.
إن ربطت filter وmap في تجاربك لاحقاً، الترتيب مهم. هذه الصفحة تبقي خطوة وسيطة واحدة لكل عرض لتبقى الشاشة سهلة القراءة.
عادات الأنبوب
أبقِ الخطوات بالترتيب أثناء التمرين.
📊 عادات Stream لـ Pipe
| Step | Call | Beginner check |
|---|---|---|
| Start | names.stream() |
opens the pipeline from the list |
| Keep some | filter(n -> ...) |
lambda returns true to keep |
| Change each | map(n -> ...) |
lambda returns the new value |
| Finish print | forEach(n -> System.out.println(n)) |
terminal step that prints |
Skip stream() |
list has no filter in this shape |
put stream() before filter or map |
Streams ليست Lambda فقط وليست Records
علّم Lambda forEach مباشرة على القائمة. Streams يضع stream() أولاً لتستطيع filter أو map قبل forEach النهائي. Records سيقدّم نوع بيانات مضغوطاً في صفحة اختيارية لاحقة. لا تخلط هذه المهام الثلاث في ملف مبتدئ واحد اليوم.
oak التي يبقيها filter ما زالت عنصر قائمة يمر في الأنبوب. ليست args[0] من Flag. عندما يطبع ملف Cue متبقي كل عنصر بلا filter، اتركه كتاريخ وأبقِ سطر stream().filter في Pipe.
بلا stream()، استدعاءات filter وmap على هذه الصفحة ليست الشكل التعليمي. بلا forEach نهائي، الأنبوب لا يطبع. أبقِ طرفي الأنبوب معاً أثناء تمرين كل عرض. أبقِ صيغة Records خارج هذه الصفحة حتى ذلك الدرس، حتى لو قرأت عنواناً عن أنواع بيانات مضغوطة في المسار الاختياري.
فحوص المجلد قبل Records
اعرض المجلد بعد تجميع ناجح. يجب أن ترى Pipe.java وPipe.class معاً. عدّل المصدر، احفظ، شغّل javac Pipe.java، ثم java Pipe. ملف .class قديم قد يعرض شاشة filter قديمة إن تخطيت التجميع بعد التحويل إلى map.
إن اشتكى javac من فئات عامة مكررة، أبقِ Pipe فقط عامة. إن أظهرت الشاشة oak وpine معاً في عرض filter، قد يغيب فحص startsWith("o") — أعد lambda الـfilter. إن لم يطبع شيء، تأكد أن add نفذ قبل stream().
لا تلصق forEach لقائمة فقط من Cue كبديل للأنبوب كاملاً على هذه الصفحة. لا تلصق get(0) من Bin داخل Pipe. مهمة streams الاختيارية هي stream زائد خطوة وسيطة واحدة زائد forEach.
قبل Records الاختياري
يمكنك أن تبقي الفئة العامة Pipe، وتستورد ArrayList، وتضيف "oak" و"pine"، وتستدعي names.stream().filter(n -> n.startsWith("o")).forEach(...)، وترى oak، ثم تستدعي names.stream().map(n -> n.toUpperCase()).forEach(...)، وترى OAK ثم PINE. جمّع بـjavac Pipe.java وشغّل java Pipe. الجدول يفصل البداية والتصفية والتحويل والنهاية. الصفحة الاختيارية التالية هي Records.
أبقِ عروض Pipe لزوج streams واضح. أبقِ ملفات lambda Cue خارج هذه الصفحة عند تمرين الأنابيب. أبقِ ملفات Generics Bin خارج هذه الصفحة عند تمرين الأنابيب. أبقِ عمل Records خارج هذه الصفحة حتى ذلك الدرس. هذه العادات نقطة تفتيش قبل المتابعة. عندما تعرض شاشة filter oak أو شاشة map OAK ثم PINE، أنجزت Streams عملها لهذا الدرس وأنت جاهز لـRecords إن واصلت المسار الاختياري.
مرّة أخيرة على المجلد: Pipe عامة واحدة، الاستيراد حاضر، ArrayList<String> مُنمّط، stream() قبل filter أو map، forEach نهائي، بلا انتظار Scanner، بلا كلمات تشغيل مطلوبة. شغّل javac Pipe.java وjava Pipe مرة أخرى على العرض المفتوح. إن بقيت الشاشة تعرض oak أو OAK ثم PINE، شكل Streams متين ويمكن للدورة الانتقال إلى Records الاختياري في الصفحة التالية. فضّل عادة أنبوب واضحة في كل قراءة ليعلّم كل مرور نفس الخريطة.
🧠 اختبر معرفتك
اختبر معرفتك
تحدى نفسك مع هذا الاختبار التفاعلي واكتشف مدى فهمك للموضوع
📝 التعليمات
- اقرأ كل سؤال بعناية
- اختر أفضل إجابة لكل سؤال
- يمكنك إعادة الاختبار عدة مرات كما تريد
- سيتم عرض تقدمك في الأعلى