"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > تيارات وLambdas في جافا: دليل للبرمجة الوظيفية مع أمثلة

تيارات وLambdas في جافا: دليل للبرمجة الوظيفية مع أمثلة

تم النشر بتاريخ 2024-08-21
تصفح:731

Streams and Lambdas in Java: A Guide to Functional Programming with Examples

البرمجة الوظيفية هي أسلوب يستخدم على نطاق واسع في تطوير البرمجيات الحديثة. جافا، كونها لغة تدعم البرمجة الشيئية والوظيفية، قدمت التدفقات واللامدا في نسختها الثامنة. تسمح هذه الميزات للمطورين بتطبيق النمط الوظيفي على المجموعات، مما يجعل العمليات على المجموعات أكثر كفاءة ونظيفة.

التدفقات في جافا
تعمل التدفقات في Java على تحويل المجموعة إلى تدفق من العناصر. إنها تمكن المطورين من إجراء عمليات وظيفية على المجموعات مثل التعيين والتصفية والتقليل. من الأفضل استخدام التدفقات للعمليات التي تتضمن تحويل البيانات أو تجميعها أو تصفيتها.

مثال على استخدام التدفقات هو فرز قائمة الأسماء بالترتيب الأبجدي. يمكننا إنشاء قائمة بالأسماء ومن ثم استخدام التدفقات لفرزها كما هو موضح أدناه:

Listnames = Arrays.asList("John", "Mary", "David", "Emily", "Tom");
names.stream().sorted().forEach(System.out::println); // الإخراج: ديفيد، إميلي، جون، ماري، توم

لقد قمنا هنا بإنشاء دفق باستخدام طريقة الدفق () في القائمة. قمنا بعد ذلك بتطبيق الطريقة التي تم فرزها () لفرز العناصر الموجودة في الدفق بالترتيب الطبيعي. وأخيرًا، يتم استخدام طريقة forEach() لطباعة كل عنصر في الدفق.

لامدا في جاوة
تُستخدم Lambdas لتحديد وظائف من الدرجة الأولى في Java. يمكن لهذه الوظائف أن تستهلك عناصر من الدفق وتنفذ العمليات عليها. يتم تعريف Lambdas خارج الفصل الدراسي ويمكن تمريرها كوسائط إلى الوظائف.

لاستخدام لامدا مع التدفقات، نحتاج إلى فهم مفهوم الواجهات الوظيفية. هذه واجهات لها طريقة مجردة واحدة فقط. يمكن استخدام تعبيرات Lambda لتوفير تنفيذ ملموس للطريقة المجردة للواجهة الوظيفية.

فرز قائمة الأسماء باستخدام لامداس
بناءً على المثال أعلاه، فلنرتب الأسماء بترتيب تنازلي باستخدام لامدا.

Listnames = Arrays.asList("John", "Mary", "David", "Emily", "Tom");
names.stream().sorted((a, b) -> b.compareTo(a)).forEach(System.out::println)); // الإخراج: توم، ماري، جون، إميلي، ديفيد

لقد استخدمنا هنا تعبير لامدا كوسيطة للطريقة التي تم فرزها (). تقبل دالة lambda الوسيطتين (a وb) وتقارنهما، مما يؤدي إلى إرجاع قيمة موجبة أو سالبة أو صفرية بناءً على المقارنة. وهذا يسمح لنا بفرز العناصر بترتيب تنازلي باستخدام طريقة CompareTo() على العناصر.

تحويل البث مرة أخرى إلى مجموعة
في بعض الحالات، قد نرغب في إعادة الدفق إلى مجموعة بعد إجراء العمليات عليه. يمكننا القيام بذلك باستخدام طريقة التجميع ()، والتي تأخذ كائن Collector كوسيطة.

قائمة أسماء مرشحة = أسماء.ستريم ()
.filter(name -> name. length() > 4) // احتفظ فقط بالأسماء ذات الطول > 4
.collect(Collectors.toList()); // إرجاع قائمة بالأسماء التي تمت تصفيتها

تأخذ طريقة التجميع () واجهة وظيفية من النوع Collector وتستخدمها لتجميع العناصر في المجموعة. في المثال أعلاه، استخدمنا طريقة toList() من فئة Collectors لإنشاء قائمة بالأسماء التي تمت تصفيتها.

عمليات أخرى على التدفقات
وبصرف النظر عن الفرز والتصفية، هناك عمليات أخرى يمكن إجراؤها على التدفقات مثل رسم الخرائط والتقليل والتكرار. تتيح لنا هذه العمليات تحويل العناصر الموجودة في التدفق وتقليلها وتكرارها على التوالي.

تخطيط وتقليل تدفق الأرقام
لنفترض أن لدينا قائمة من الأرقام ونريد إيجاد مجموع كل الأرقام الزوجية. يمكننا القيام بذلك باستخدام طرق الخريطة () والتقليل ().

Listأرقام = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
مجموع كثافة العمليات = أرقام.الدفق ()
.filter(num -> num % 2 == 0) //تصفية الأرقام الفردية
.map(num -> num * 2) // مضاعفة الأرقام الزوجية
.reduce(0, (a, b) -> a b); // جمع جميع الأرقام معًا

هنا، استخدمنا طريقة الخريطة () لمضاعفة الأرقام الزوجية في الدفق ثم استخدمنا طريقة تقليل () لجمع جميع الأرقام معًا. والنتيجة هي مجموع كافة الأرقام الزوجية في القائمة.

إعادة استخدام العمليات على التدفقات
في بعض الحالات، قد نحتاج إلى استخدام نفس العملية الوظيفية على تدفقات متعددة. لتجنب كتابة نفس الكود مرارًا وتكرارًا، يمكننا إنشاء واجهة وظيفية وتمريرها كوسيطة إلى الطرق.

لنأخذ مثال فرز قائمة الأسماء حسب اسم العائلة. يمكننا إنشاء فئة مقارنة تنفذ واجهة المقارنة وتمريرها كوسيطة إلى الطريقة التي تم فرزها ().

فئة ثابتة LastNameComparator تنفذ Comparator {
@تجاوز
مقارنة int العامة (اسم السلسلة 1، اسم السلسلة 2) {
String[] parts1 = name1.split(" ");
سلسلة lastName1 = parts1[parts1.length - 1];
String[] parts2 = name2.split(" ");
سلسلة lastName2 = parts2[parts2.length - 1];
إرجاع lastName2.compareTo(lastName1);



names.stream().sorted(new LastNameComparator()).forEach(System.out::println); // الإخراج: إميلي، ديفيد، جون، ماري، توم

لقد قمنا هنا بتمرير LastNameComparator كوسيطة للطريقة التي تم فرزها () لفرز الأسماء حسب اسم العائلة.

خاتمة
توفر التدفقات و lambdas في Java طريقة قوية وفعالة لتنفيذ العمليات الوظيفية على المجموعات. إنها تمكن المطورين من كتابة تعليمات برمجية نظيفة وموجزة وقابلة لإعادة الاستخدام. من خلال فهم مفاهيم التدفقات واللامدا، يمكننا تحسين مهاراتنا العامة في البرمجة وكتابة تعليمات برمجية أكثر كفاءة.

إحدى الطرق الفعالة لتحسين مهاراتك في Java هي الحصول على أحدث شهادة Java واستخدام اختبارات التدريب 1Z0-830 المتوفرة على MyExamCloud.

بيان الافراج تم إعادة إنتاج هذه المقالة على: https://dev.to/myexamcloud/streams-and-lambdas-in-java-a-guide-to-functional-programming-with-examples-4cij?1 إذا كان هناك أي انتهاك، من فضلك اتصل بـ [email protected]
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3