العودة إلى الدورة

تعمق في واجهة برمجة تطبيقات Streams في Java (Filter, Map, Reduce)

إتقان لغة Java: من الصفر إلى مطور محترف (رحلة من 50 درساً)

الدرس 49: تعمق في واجهة برمجة تطبيقات Streams في Java

تعد واجهة Streams API (منذ Java 8+) واحدة من أقوى الميزات لمعالجة تسلسل البيانات (المجموعات أو المصفوفات) بأسلوب وظيفي وتصريحي.

1. ما هو الـ Stream؟

الـ Stream هو تسلسل من العناصر يدعم العمليات التجميعية المتسلسلة والمتوازية. الأهم من ذلك، أن الـ Stream:

  • ليس هيكل بيانات: لا يخزن البيانات؛ بل ينقل البيانات من مصدر (مثل القائمة).
  • وظيفي: العمليات لا تعدل بيانات المصدر.
  • كسول (Lazy): لا يتم تنفيذ العمليات إلا عند استدعاء عملية نهائية.

2. هيكل خط أنابيب الـ Stream

يتكون خط أنابيب الـ Stream من ثلاثة أجزاء:

  1. المصدر: مجموعة أو مصفوفة (list.stream()).
  2. العمليات الوسيطة: تحول الـ stream وتعيد stream جديد (مثل filter, map, sorted). وهي عمليات كسولة.
  3. العملية النهائية: تنتج نتيجة أو تأثيراً جانبياً (مثل forEach, collect, count). وهذا ما يطلق التنفيذ.

3. العمليات الوسيطة الأساسية

  • filter(): تختار العناصر التي تطابق شرطاً معيناً.
  • map(): تحول كل عنصر إلى قيمة جديدة.

java List words = List.of("apple", "banana", "cat", "dog");

List result = words.stream() .filter(w -> w.length() > 3) // يبقي على 'apple', 'banana' .map(String::toUpperCase) // يحولها للأحرف الكبيرة .collect(Collectors.toList());

System.out.println(result); // المخرج: [APPLE, BANANA]

4. عملية reduce()

تقوم reduce() بدمج جميع العناصر في الـ stream لإنتاج نتيجة واحدة (مثل المجموع).

java List nums = List.of(1, 2, 3, 4); int sum = nums.stream().reduce(0, (a, b) -> a + b);