English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
واجهة الوظيفية (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، الواجهات الفункциونية في هذا المجلد هي:
الرقم | الواجهة & الوصف |
---|---|
1 | BiConsumer<T,U> تمثل عملية تأخذ معاملين دون إرجاع أي شيء. |
2 | BiFunction<T,U,R> تمثل دالة تأخذ معاملين وترجع نتيجة. |
3 | BinaryOperator<T> تمثل عملية تأخذ معاملين من نفس النوع وترجع نتيجة من نفس النوع. |
4 | BiPredicate<T,U> تمثل دالة boolean تحتوي على معاملين. |
5 | BooleanSupplier تمثل بائع نتيجة boolean. |
6 | Consumer<T> تمثل عملية تأخذ معاملات من نوع double دون إرجاع أي شيء. |
7 | DoubleBinaryOperator تمثل عملية تأخذ معاملين من نوع double وترجع نتيجة من نوع double. |
8 | DoubleConsumer تمثل عملية تأخذ معامل من نوع double ولا تعود بأي شيء. |
9 | DoubleFunction<R> تمثل دالة تأخذ معامل من نوع double وترجع النتيجة. |
10 | DoublePredicate تمثل دالة boolean تحتوي على معامل double. |
11 | DoubleSupplier تمثل بائع هيكل القيمة double. |
12 | DoubleToIntFunction استقبل معامل من نوع double، ويرجع النتيجة إلى نوع int. |
13 | DoubleToLongFunction استقبل معامل من نوع double، ويرجع النتيجة إلى نوع long. |
14 | DoubleUnaryOperator استقبل معامل من نوع double، والنوع المرجع هو أيضًا double. |
15 | Function<T,R> استقبل معاملات من نوع int، ويرجع النتيجة. |
16 | IntBinaryOperator استقبل معاملين من نفس النوع int، والنوع المرجع هو أيضًا int. |
17 | IntConsumer استقبل معاملات من نوع int بدون إرجاع قيمة. |
18 | IntFunction<R> استقبل مفتاح إدخال من نوع int، يرجع النتيجة. |
19 | IntPredicate يستقبل مفتاح إدخال من نوع int، يرجع النتيجة نوع boolean. |
20 | IntSupplier لا يحتوي على مفتاح إدخال، يرجع النتيجة من نوع int. |
21 | IntToDoubleFunction استقبل نوع int كإدخال، يرجع النتيجة من نوع double. |
22 | IntToLongFunction استقبل نوع int كإدخال، يرجع النتيجة من نوع long. |
23 | IntUnaryOperator استقبل مفتاح إدخال واحد من نوع int، يرجع النتيجة من نوع int. |
24 | LongBinaryOperator استقبل إثنين من مفتاحي الإدخال من نوع long، يرجع النتيجة من نوع long. |
25 | LongConsumer استقبل مفتاح إدخال من نوع long، لا يرجع أي قيمة. |
26 | LongFunction<R> استقبل مفتاح إدخال من نوع long، يرجع النتيجة. |
27 | LongPredicate R يرجع قيمة من نوع long كإدخال، يرجع النتيجة نوع boolean. |
28 | LongSupplier لا يحتوي على مفتاح إدخال، يرجع النتيجة من نوع long. |
29 | LongToDoubleFunction استقبل نوع long كإدخال، يرجع النتيجة نوع double. |
30 | LongToIntFunction استقبل نوع long كإدخال، يرجع النتيجة نوع int. |
31 | LongUnaryOperator استقبل مفتاح إدخال واحد من نوع long، يرجع النتيجة من نوع long. |
32 | ObjDoubleConsumer<T> استقبل نوع object ونوع double كإدخال، لا يرجع أي قيمة. |
33 | ObjIntConsumer<T> استقبل نوع object ونوع int كإدخال، لا يرجع أي قيمة. |
34 | ObjLongConsumer<T> استقبل نوع object ونوع long كإدخال، لا يرجع أي قيمة. |
35 | Predicate<T> استقبل مفتاح إدخال واحد، يرجع النتيجة نوع boolean. |
36 | Supplier<T> لا يحتوي على مفتاح إدخال، يرجع النتيجة. |
37 | ToDoubleBiFunction<T,U> استقبل إثنين من مفتاحي الإدخال، يرجع النتيجة نوع double |
38 | ToDoubleFunction<T> استقبل مفتاح إدخال، يرجع النتيجة نوع double |
39 | ToIntBiFunction<T,U> تقبل مدخلين، وتعيد نتيجة من نوع int. |
40 | ToIntFunction<T> تقبل مدخلاً واحداً، وتعيد نتيجة من نوع int. |
41 | ToLongBiFunction<T,U> تقبل مدخلين، وتعيد نتيجة من نوع long. |
42 | ToLongFunction<T> تقبل مدخلاً واحداً، وتعيد نتيجة من نوع long. |
43 | UnaryOperator<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