logo

واجهات جافا الوظيفية

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

بدءًا من Java 8 فصاعدًا، يمكن استخدام تعبيرات lambda ومراجع الأساليب لتمثيل مثيل الواجهة الوظيفية.



مثال: استخدام واجهة وظيفية مع تعبير Lambda

Java
public class Geeks {    public static void main(String[] args) {    // Using lambda expression to implement Runnable  new Thread(() -> System.out.println('New thread created')).start();  } } 

الإخراج
New thread created 

توضيح:

  • يوضح البرنامج أعلاه استخدام تعبير lambda مع الواجهة الوظيفية Runnable.
  • يحتوي Runnable على طريقة مجردة واحدة () لذا فهي مؤهلة كواجهة وظيفية.
  • تحدد Lambda ()-> System.out.println('تم إنشاء موضوع جديد') طريقة التشغيل ().
  • new Thread().start() يبدأ خيطًا جديدًا ينفذ نص لامدا

ملحوظة:

أ و يمكن للواجهة غير الوظيفية أيضًا توسيع واجهة وظيفية أخرى.



@الواجهة الوظيفية تعليق توضيحي

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

ملحوظة:

يعد التعليق التوضيحي @FunctionalInterface اختياريًا ولكنه يعد ممارسة جيدة للاستخدام. يساعد في اكتشاف الخطأ في مرحلة مبكرة من خلال التأكد من أن الواجهة تحتوي على طريقة مجردة واحدة فقط.



مثال: تحديد واجهة وظيفية باستخدام التعليق التوضيحي @FunctionalInterface

Java
@FunctionalInterface interface Square {  int calculate(int x); } class Geeks {  public static void main(String args[]) {  int a = 5;  // lambda expression to define the calculate method  Square s = (int x) -> x * x;  // parameter passed and return type must be same as defined in the prototype  int ans = s.calculate(a);  System.out.println(ans);  } } 

الإخراج
25 

توضيح :

  • Square عبارة عن واجهة وظيفية ذات طريقة واحدة للحساب (int x).
  • يتم استخدام تعبير لامدا (int x) -> x * x لتنفيذ طريقة الحساب.
  • تأخذ Lambda x كمدخل وتعيد x * x.

واجهات جافا الوظيفية قبل جافا 8

قبل Java 8، كان علينا إنشاء كائنات فئة داخلية مجهولة أو تنفيذ هذه الواجهات. يوجد أدناه مثال لكيفية تنفيذ واجهة Runnable قبل تقديم تعبيرات lambda.

مثال: برنامج جافا لإظهار الواجهة الوظيفية

Java
class Geeks {  public static void main(String args[]) {    // create anonymous inner class object  new Thread(new Runnable() {  @Override public void run()  {  System.out.println('New thread created');  }  }).start();  } } 

الإخراج
New thread created 

واجهات جافا الوظيفية المضمنة

منذ إصدار Java SE 1.8 وما بعده، هناك العديد من الواجهات التي تم تحويلها إلى واجهات وظيفية. يتم شرح كل هذه الواجهات باستخدام @FunctionalInterface. وهذه الواجهات هي كما يلي:

وظيفة السلسلة الفرعية جافا
  • قابل للتشغيل: تحتوي هذه الواجهة فقط على يجري() طريقة.
  • قابلة للمقارنة: تحتوي هذه الواجهة فقط على طريقة CompareTo().
  • مستمع العمل: تحتوي هذه الواجهة فقط على طريقة actionPerformed().
  • قابل للاستدعاء: تحتوي هذه الواجهة فقط على طريقة call().

أنواع الواجهات الوظيفية في جافا

يتضمن Java SE 8 أربعة أنواع رئيسية من الواجهات الوظيفية التي يمكن تطبيقها في مواقف متعددة كما هو مذكور أدناه:

  1. مستهلك
  2. المسند
  3. وظيفة 
  4. مزود

1. المستهلك 

ال واجهة المستهلك الواجهة الوظيفية هي تلك التي تقبل وسيطة واحدة فقط أو وسيطة معززة. واجهة المستهلك ليس لها قيمة إرجاع. لا يعود شيئا. هناك أيضًا متغيرات وظيفية للمستهلك DoubleConsumer IntConsumer و LongConsumer . تقبل هذه المتغيرات القيم الأولية كوسائط. 

بخلاف هذه المتغيرات، يوجد أيضًا متغير آخر لواجهة المستهلك يُعرف باسم ثنائي المستهلك

بناء الجملة:

مستهلك المستهلك = (القيمة) -> System.out.println(value);

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

2. المسند 

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

بناء الجملة: 

الواجهة العامة المسند{
   اختبار منطقي(T t);
}

يمكن أيضًا تنفيذ الواجهة الوظيفية المسندة لـ Java باستخدام تعبيرات Lambda.

المسند المسند = (القيمة) -> القيمة != فارغة؛

سلسلة تحليل جافا إلى int

3. الوظيفة

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

بناء الجملة:

وظيفة الوظيفة = (القيمة) -> القيمة * القيمة؛

  • وظيفة ثنائية: ال ثنائية الوظيفة يرتبط بشكل كبير بالوظيفة. بالإضافة إلى أنها تأخذ وسيطتين بينما تقبل الوظيفة وسيطة واحدة. 
  • المشغل الأحادي والمشغل الثنائي: هناك أيضًا واجهتان وظيفيتان أخريان تم تسميتهما باسم المشغل الأحادي و مشغل ثنائي. كلاهما يعمل على توسيع الوظيفة والوظيفة الثنائية على التوالي حيث يكون نوع الإدخال ونوع الإخراج متماثلين.

4. المورد

ال مزود الواجهة الوظيفية هي أيضًا نوع من الواجهة الوظيفية التي لا تأخذ أي إدخال أو وسيطة ولكنها تُرجع مخرجًا واحدًا. تحتوي الامتدادات المختلفة للواجهة الوظيفية للمورد على العديد من وظائف الموردين الآخرين مثل BooleanSupplier DoubleSupplier LongSupplier و IntSupplier . نوع الإرجاع لجميع هذه التخصصات الإضافية هو الأوليات المقابلة لها فقط. 

بناء الجملة:

مزودالمورد = () -> 'مرحبا بالعالم!';

مثال: استخدام واجهة المسند لتصفية السلاسل

Java
import java.util.*; import java.util.function.Predicate; class Geeks {  public static void main(String args[]) {    // create a list of strings  List<String> n = Arrays.asList('Geek' 'GeeksQuiz' 'g1' 'QA' 'Geek2');  // declare the predicate type as string and use lambda expression to create object  Predicate<String> p = (s) -> s.startsWith('G');  // Iterate through the list  for (String st : n) {    // call the test method  if (p.test(st))  System.out.println(st);  }  } } 

الإخراج
Geek GeeksQuiz Geek2 

جدول الواجهات الوظيفية

واجهات وظيفية

وصف

طريقة

قابل للتشغيل

إنه يمثل مهمة يمكن تنفيذها بواسطة مؤشر ترابط.

تشغيل باطل ()

قابلة للمقارنة

يقارن بين شيئين للطلب.

كثافة العمليات مقارنة مع (T س)

ActionListener

يتعامل مع حدث عمل في البرمجة القائمة على الحدث.

إجراء باطل تم تنفيذه (ActionEvent e)

يونيكس مقابل ويندوز

قابل للاستدعاء

إنه يمثل مهمة يمكنها إرجاع نتيجة أو طرح استثناء.

V call() يلقي استثناء

مستهلك

يقبل وسيطة إدخال واحدة ولا يُرجع أي نتيجة.

قبول باطلة (ر ر)

المسند

يقبل وسيطة واحدة ويعيد نتيجة منطقية.

هندسة الشبكات

اختبار منطقي(Tر)

وظيفة

يقبل وسيطة واحدة ويعيد النتيجة.

تطبيق R (ر ر)

مزود

لا يتطلب الأمر أي حجج ولكنه يقدم نتيجة.

الحصول على ()

BiConsumer

يقبل وسيطتين ولا يُرجع أي نتيجة.

قبول باطلة (T T U u)

BiPredicate

يقبل وسيطتين ويعيد نتيجة منطقية.

تحديد جدول متعدد في SQL

اختبار منطقي(T t U u)

وظيفة ثنائية

يقبل وسيطتين ويعيد النتيجة.

R تطبيق (T T U U)

UnaryOperator

هذه حالة خاصة من الوظيفة حيث تكون أنواع الإدخال والإخراج متماثلة.

تطبيق تي (تي تي)

BinaryOperator

هذه حالة خاصة من BiFunction حيث تكون أنواع الإدخال والإخراج متماثلة.

تطبيق T (T t1 T t2)

مقالات ذات صلة

  • جافا 8
  • تعبيرات جافا لامدا