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

الواجهة الوظيفية في 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.

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

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

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

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

وظيفة ثنائية

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

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

UnaryOperator

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

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

BinaryOperator

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

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

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

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