الانتقال إلى المحتوى الرئيسي
الوحدة 7 · الدرس 2 من 214/14 في الدورة~15 min
دروس الوحدة (2/2)

دفق API

تتيح لك Stream API في Java معالجة مجموعات من الكائنات بطريقة تعريفية، مع الاستفادة من البرمجة الوظيفية. لا يقوم الدفق بتخزين البيانات، ولكنه يحمل بدلاً من ذلك عناصر من مصدر (مثل قائمة أو مصفوفة) من خلال مسار العمليات.

يتكون خط أنابيب الدفق من ثلاثة أجزاء:

  1. مصدر (على سبيل المثال، list.stream())
  2. صفر أو أكثر من العمليات المتوسطة (التي تعرض دفقًا جديدًا، على سبيل المثال، filter، map)
  3. عملية طرفية (والتي تنتج نتيجة نهائية أو أثر جانبي وتغلق البث، على سبيل المثال، collect، forEach، reduce)

العمليات الوسيطة المشتركة

العمليات الوسيطة كسولة: لا يتم تنفيذها حتى يتم استدعاء العملية الطرفية.

  • filter(Predicate): يقوم بتصفية العناصر بناءً على شرط منطقي.
  • map(Function): يحول كل عنصر إلى كائن آخر عن طريق تطبيق دالة.
  • sorted(): فرز عناصر الدفق.
Java
List<String> names = Arrays.asList("Marco", "Anna", "Giovanni");
List<String> filtered = names.stream()
                             .filter(name -> name.startsWith("M"))
                             .map(name -> name.toUpperCase())
                             .collect(Collectors.toList()); // "MARCO"

العمليات الطرفية المشتركة

  • forEach(Consumer): ينفذ إجراءً لكل عنصر من عناصر الدفق.
  • collect(Collector): يجمع نتائج الدفق في حاوية (على سبيل المثال، قائمة تستخدم Collectors.toList()).
  • reduce(identity, BinaryOperator): يجمع عناصر الدفق في قيمة تراكمية واحدة.
Java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream()
                 .reduce(0, (a, b) -> a + b); // Sums all numbers: 10

جربه بنفسك

تمرين#java.m7.l2.e1
المحاولات: 0جارٍ التحميل…

أكمل التعليمات البرمجية باستخدام دفق الأرقام لتصفية الأرقام الزوجية فقط، وجمعها في قائمة جديدة تسمى الأرقام الزوجية، ثم طباعتها باستخدام System.out.println.

جارٍ تحميل المحرر…
إظهار التلميح

ابدأ باستدعاء `numbers.stream()` وألحق `.filter(n -> n % 2 == 0)`، وأخيرًا اجمع باستخدام `.collect(Collectors.toList())`.

الحل متاح بعد 3 من المحاولات

تمرين#java.m7.l2.e2
المحاولات: 0جارٍ التحميل…

استخدم التدفقات لتحويل جميع الأسماء الموجودة داخل قائمة الأسماء إلى أحرف كبيرة باستخدام الخريطة، وطباعتها واحدًا تلو الآخر باستخدام forEach مع مرجع الطريقة.

جارٍ تحميل المحرر…
إظهار التلميح

استخدم `.map(s -> s.toUpperCase())` متبوعًا بالعملية الطرفية `.forEach(System.out::println)`.

الحل متاح بعد 3 من المحاولات

تمرين#java.m7.l2.e3
المحاولات: 0جارٍ التحميل…

أكمل الكود عن طريق حساب مجموع كل الأرقام في قائمة الأرقام باستخدام الدفق وعملية التخفيض الطرفية بقيمة أولية 0. اطبع المجموع.

جارٍ تحميل المحرر…
إظهار التلميح

استخدم `numbers.stream().reduce(0, (a, b) -> a + b)` واطبع المتغير الناتج.

الحل متاح بعد 3 من المحاولات