دروس الوحدة (2/2)
دفق API
تتيح لك Stream API في Java معالجة مجموعات من الكائنات بطريقة تعريفية، مع الاستفادة من البرمجة الوظيفية. لا يقوم الدفق بتخزين البيانات، ولكنه يحمل بدلاً من ذلك عناصر من مصدر (مثل قائمة أو مصفوفة) من خلال مسار العمليات.
يتكون خط أنابيب الدفق من ثلاثة أجزاء:
- مصدر (على سبيل المثال،
list.stream()) - صفر أو أكثر من العمليات المتوسطة (التي تعرض دفقًا جديدًا، على سبيل المثال،
filter،map) - عملية طرفية (والتي تنتج نتيجة نهائية أو أثر جانبي وتغلق البث، على سبيل المثال،
collect،forEach،reduce)
العمليات الوسيطة المشتركة
العمليات الوسيطة كسولة: لا يتم تنفيذها حتى يتم استدعاء العملية الطرفية.
filter(Predicate): يقوم بتصفية العناصر بناءً على شرط منطقي.map(Function): يحول كل عنصر إلى كائن آخر عن طريق تطبيق دالة.sorted(): فرز عناصر الدفق.
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): يجمع عناصر الدفق في قيمة تراكمية واحدة.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream()
.reduce(0, (a, b) -> a + b); // Sums all numbers: 10جربه بنفسك
أكمل التعليمات البرمجية باستخدام دفق الأرقام لتصفية الأرقام الزوجية فقط، وجمعها في قائمة جديدة تسمى الأرقام الزوجية، ثم طباعتها باستخدام System.out.println.
إظهار التلميح
ابدأ باستدعاء `numbers.stream()` وألحق `.filter(n -> n % 2 == 0)`، وأخيرًا اجمع باستخدام `.collect(Collectors.toList())`.
الحل متاح بعد 3 من المحاولات
استخدم التدفقات لتحويل جميع الأسماء الموجودة داخل قائمة الأسماء إلى أحرف كبيرة باستخدام الخريطة، وطباعتها واحدًا تلو الآخر باستخدام forEach مع مرجع الطريقة.
إظهار التلميح
استخدم `.map(s -> s.toUpperCase())` متبوعًا بالعملية الطرفية `.forEach(System.out::println)`.
الحل متاح بعد 3 من المحاولات
أكمل الكود عن طريق حساب مجموع كل الأرقام في قائمة الأرقام باستخدام الدفق وعملية التخفيض الطرفية بقيمة أولية 0. اطبع المجموع.
إظهار التلميح
استخدم `numbers.stream().reduce(0, (a, b) -> a + b)` واطبع المتغير الناتج.
الحل متاح بعد 3 من المحاولات