Stream API
واجهة الـ Stream Stream API
Stream تسمح بمعالجة سلسلة من العناصر بداليًا: filter و map و reduce و collect.
Stream واجهة تمثّل تدفقًا للمعالجة — لا تعدّل المصدر الأصلي. تدعم سلاسل من العمليات: تصفية (filter)، تحويل (map)، تجميع (collect)، وتقليل (reduce). تُنفَّذ كسلاسل كسولة (lazy) — لا تنفّذ إلا عند الحاجة.
الصياغة
stream.filter(pred).map(fn).collect(collector) stream.reduce(identity, accumulator) stream.forEach(action) stream.sorted().distinct().count()
📄 مثال
import java.util.*;
import java.util.stream.*;
List<Integer> nums = List.of(1, 2, 3, 4, 5, 6, 7, 8);
// filter + map + collect:
List<Integer> evensSquared = nums.stream()
.filter(n -> n % 2 == 0)
.map(n -> n * n)
.toList(); // [4, 16, 36, 64]
// reduce:
int sum = nums.stream()
.reduce(0, Integer::sum); // 36
// count + sorted:
long count = nums.stream()
.filter(n -> n > 3)
.sorted()
.count(); // 5
// grouping:
Map<Boolean, List<Integer>> grouped = nums.stream()
.collect(Collectors.partitioningBy(n -> n % 2 == 0));أهم النقاط
| العنصر | الوظيفة |
|---|---|
| filter(pred) | يُبقي العناصر التي تحقق الشرط |
| map(fn) | يحوّل كل عنصر |
| reduce(id, op) | يُجمع كل العناصر لقيمة واحدة |
| collect(collector) | يُجمع النتيجة لمجموعة |
| sorted() | ترتيب تصاعدي |
| distinct() | حذف المكرر |
| forEach(action) | تنفيذ على كل عنصر |
| toList() / toSet() | تحويل لمجموعة |
💡 نصائح عملية
- Stream كسولة — لا تنفّذ أي شيء حتى تستدعي terminal operation مثل collect أو forEach
- toList() أبسط من collect(Collectors.toList()) — متوفرة منذ Java 16
⚠️ أخطاء شائعة
- nxing stream() مرتين — Stream لا يمكن إعادة استخدامها
- nxing sorted() مع map() — قد تُفقد العناصر الأصلية إذا الهدف مجموعات مختلفة
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار JAVA الكامل بالعربي.