English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تعليمات Java الأساسية

Java Flow Control

Java Arrays

Java Object-Oriented (I)

Java Object-Oriented (II)

Java Object-Oriented (III)

معالجة الاستثنائات Java

Java List

Java Queue (Queue)

Java Map Collections

Java Set Collections

Java Input/Output (I/O)

Java Reader/Writer

مواضيع أخرى في JAVA

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

Java 8 New Features

واجهة الوظيفية (Functional Interface) هي واجهة تحتوي على抽象ة واحدة فقط، ولكن يمكن أن تحتوي على عدة طرق غير抽象ة.

واجهات الوظيفية يمكن تحويلها بسرعة إلى تعبيرات Lambda.

تعبيرات Lambda ومراجع الطريقة (ويمكن اعتبارها تعبيرات Lambda) على.

مثل تعريف واجهة وظيفية كالتالي:

@FunctionalInterface
interface GreetingService 
{
    void sayMessage(String message);
}

ثم يمكن استخدام تعبيرات Lambda لتمثيل إحدى implementations لهذه الواجهة (ملاحظة: قبل JAVA 8 كان يتم استخدام كلاسات مجهولة المصدر عادةً):

GreetingService greetService1 = message -> System.out.println("Hello " + message);

واجهات الوظيفية تدعم بشكل جيد الوظائف الحالية.

قبل JDK 1.8 كانت هناك واجهات وظيفية:

  • java.lang.Runnable

  • java.util.concurrent.Callable

  • java.security.PrivilegedAction

  • java.util.Comparator

  • java.io.FileFilter

  • java.nio.file.PathMatcher

  • java.lang.reflect.InvocationHandler

  • java.beans.PropertyChangeListener

  • java.awt.event.ActionListener

  • javax.swing.event.ChangeListener

واجهات JDK 1.8 الجديدة:

  • java.util.function

java.util.function تحتوي على العديد من الفئات، لدعم البرمجة الفункциونية في Java، الواجهات الفункциونية في هذا المجلد هي:

الرقمالواجهة & الوصف
1BiConsumer<T,U>

تمثل عملية تأخذ معاملين دون إرجاع أي شيء.

2BiFunction<T,U,R>

تمثل دالة تأخذ معاملين وترجع نتيجة.

3BinaryOperator<T>

تمثل عملية تأخذ معاملين من نفس النوع وترجع نتيجة من نفس النوع.

4BiPredicate<T,U>

تمثل دالة boolean تحتوي على معاملين.

5BooleanSupplier

تمثل بائع نتيجة boolean.

6Consumer<T>

تمثل عملية تأخذ معاملات من نوع double دون إرجاع أي شيء.

7DoubleBinaryOperator

تمثل عملية تأخذ معاملين من نوع double وترجع نتيجة من نوع double.

8DoubleConsumer

تمثل عملية تأخذ معامل من نوع double ولا تعود بأي شيء.

9DoubleFunction<R>

تمثل دالة تأخذ معامل من نوع double وترجع النتيجة.

10DoublePredicate

تمثل دالة boolean تحتوي على معامل double.

11DoubleSupplier

تمثل بائع هيكل القيمة double.

12DoubleToIntFunction

استقبل معامل من نوع double، ويرجع النتيجة إلى نوع int.

13DoubleToLongFunction

استقبل معامل من نوع double، ويرجع النتيجة إلى نوع long.

14DoubleUnaryOperator

استقبل معامل من نوع double، والنوع المرجع هو أيضًا double.

15Function<T,R>

استقبل معاملات من نوع int، ويرجع النتيجة.

16IntBinaryOperator

استقبل معاملين من نفس النوع int، والنوع المرجع هو أيضًا int.

17IntConsumer

استقبل معاملات من نوع int بدون إرجاع قيمة.

18IntFunction<R>

استقبل مفتاح إدخال من نوع int، يرجع النتيجة.

19IntPredicate

يستقبل مفتاح إدخال من نوع int، يرجع النتيجة نوع boolean.

20IntSupplier

لا يحتوي على مفتاح إدخال، يرجع النتيجة من نوع int.

21IntToDoubleFunction

استقبل نوع int كإدخال، يرجع النتيجة من نوع double.

22IntToLongFunction

استقبل نوع int كإدخال، يرجع النتيجة من نوع long.

23IntUnaryOperator

استقبل مفتاح إدخال واحد من نوع int، يرجع النتيجة من نوع int.

24LongBinaryOperator

استقبل إثنين من مفتاحي الإدخال من نوع long، يرجع النتيجة من نوع long.

25LongConsumer

استقبل مفتاح إدخال من نوع long، لا يرجع أي قيمة.

26LongFunction<R>

استقبل مفتاح إدخال من نوع long، يرجع النتيجة.

27LongPredicate

R يرجع قيمة من نوع long كإدخال، يرجع النتيجة نوع boolean.

28LongSupplier

لا يحتوي على مفتاح إدخال، يرجع النتيجة من نوع long.

29LongToDoubleFunction

استقبل نوع long كإدخال، يرجع النتيجة نوع double.

30LongToIntFunction

استقبل نوع long كإدخال، يرجع النتيجة نوع int.

31LongUnaryOperator

استقبل مفتاح إدخال واحد من نوع long، يرجع النتيجة من نوع long.

32ObjDoubleConsumer<T>

استقبل نوع object ونوع double كإدخال، لا يرجع أي قيمة.

33ObjIntConsumer<T>

استقبل نوع object ونوع int كإدخال، لا يرجع أي قيمة.

34ObjLongConsumer<T>

استقبل نوع object ونوع long كإدخال، لا يرجع أي قيمة.

35Predicate<T>

استقبل مفتاح إدخال واحد، يرجع النتيجة نوع boolean.

36Supplier<T>

لا يحتوي على مفتاح إدخال، يرجع النتيجة.

37ToDoubleBiFunction<T,U>

استقبل إثنين من مفتاحي الإدخال، يرجع النتيجة نوع double

38ToDoubleFunction<T>

استقبل مفتاح إدخال، يرجع النتيجة نوع double

39ToIntBiFunction<T,U>

تقبل مدخلين، وتعيد نتيجة من نوع int.

40ToIntFunction<T>

تقبل مدخلاً واحداً، وتعيد نتيجة من نوع int.

41ToLongBiFunction<T,U>

تقبل مدخلين، وتعيد نتيجة من نوع long.

42ToLongFunction<T>

تقبل مدخلاً واحداً، وتعيد نتيجة من نوع long.

43UnaryOperator<T>

تقبل مدخلاً من نوع T، وتعيد قيمة من نوع T.

مثال واجهة وظيفية

واجهة Predicate <T> هي واجهة وظيفية، تقبل مدخلاً من نوع T وتعيد نتيجة نوع boolean.

يحتوي هذا المفهوم على العديد من الطرق الافتراضية لدمج Predicate في لógica معقدة أخرى (مثل: And، Or، Not).

يستخدم هذا المفهوم لتقييم كائنات هي true أو false.

يمكننا من خلال المثال التالي (Java8Tester.java) فهم استخدام واجهة الصيغة الوظيفية Predicate <T>:

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
 
public class Java8Tester {
   public static void main(String args[]){
      List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
        
      // Predicate<Integer> predicate = n -> true
      // n is a parameter passed to the test method of the Predicate interface
      // n 如果存在则 test 方法返回 true
        
      System.out.println("输出所有数据:");
        
      // 传递参数 n
      eval(list, n->true);
        
      // Predicate<Integer> predicate1 = n -> n%2 == 0
      // n is a parameter passed to the test method of the Predicate interface
      // 如果 n%2 为 0 test 方法返回 true
        
      System.out.println("输出所有偶数:");
      eval(list, n-> n%2 == 0 );
        
      // Predicate<Integer> predicate2 = n -> n > 3
      // n is a parameter passed to the test method of the Predicate interface
      // If n is greater than 3, the test method returns true
        
      System.out.println("Output all numbers greater than 3:");
      eval(list, n-> n > 3);
   }
    
   public static void eval(List<Integer> list, Predicate<Integer> predicate) {
      for(Integer n: list) {
        
         if(predicate.test(n)) {
            System.out.println(n + " ");
         }
      }
   }
}

Execute the above script, the output will be:

$ javac Java8Tester.java 
$ java Java8Tester
Output all data:
1 
2 
3 
4 
5 
6 
7 
8 
9 
Output all even numbers:
2 
4 
6 
8 
Output all numbers greater than 3:
4 
5 
6 
7 
8 
9

Java 8 New Features