6. الواجهات الوظيفية لمكتبة RxJava
تشكل فئة Observable أساس مكتبة RxJava غير المتزامنة. وهي تشترك في العديد من أوجه التشابه مع فئة Stream التي ناقشناها للتو. ومثل Stream، فإنها توفر عددًا كبيرًا من الطرق — عدة عشرات. ومثل Stream، تقبل هذه الطرق مثيلات للواجهات الوظيفية كمعلمات. سنبدأ بتقديم أكثرها شيوعًا: [Action] و [Function].
6.1. مثال-01: الواجهة الوظيفية [Action0]
![]() |
واجهة [Action0] هي كما يلي:
![]() | ![]() |
- تحتوي واجهة [Action0] على طريقة واحدة، وهي `call`، مع التوقيع [2]: `void call()`. وهي مشتقة من واجهة [Action] [1، 3]. لا تحتوي واجهة [Action] على أي طرق. يُطلق على هذا النوع من الواجهات اسم واجهة العلامة [4]. وتُستخدم بشكل أساسي لكتابة: if(c instanceOf(Action)) {...}. واجهة [Action] نفسها مشتقة من واجهة العلامة [Function] [4-6]؛
![]() |
سنوضح واجهة [Action0] باستخدام الكود التالي (مثال 01):
package dvp.rxjava.lamdbas;
import rx.functions.Action0;
public class Exemple01 {
public static void main(String[] args) {
// Action0
Action0 a01 = new Action0() {
@Override
public void call() {
System.out.println("anonymous a01.call");
}
};
Action0 a02 = () -> System.out.println("lambda ao2.call");
// displays
a01.call();
a02.call();
}
}
- الأسطر 8–13: تنفيذ واجهة [Action0] باستخدام فئة مجهولة؛
- الأسطر 8–13: تنفيذ واجهة [Action0] باستخدام لامدا؛
والنتائج هي كما يلي:
6.2. المثالان 02 و 03: الواجهة الوظيفية [Actioni]
![]() |
الواجهة [Action1] هي كما يلي:
![]() |
سنوضح ذلك باستخدام الكود التالي (المثال 02):
package dvp.rxjava.lamdbas;
import rx.functions.Action1;
public class Exemple02 {
public static void main(String[] args) {
// Action1
Action1<Integer> a10 = new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.printf("anonymous a10.call (%s)%n", integer);
}
};
Action1<Double> a11 = (d -> System.out.printf("lambda a11.call (%s)%n", d));
// executions
a10.call(20);
a11.call(17.4);
}
}
مما يعطي النتيجة التالية:
بشكل عام، [Actioni] (0 <= i <= 9) هي واجهة وظيفية ذات طريقة واحدة بالتوقيع التالي: void call(T1 t1, T2 t2, ..., Ti ti). فيما يلي مثال على [Action2] (مثال 03):
package dvp.rxjava.lamdbas;
import rx.functions.Action2;
public class Exemple03 {
public static void main(String[] args) {
// Action2
Action2<Integer, Double> a20 = new Action2<Integer, Double>() {
@Override
public void call(Integer integer, Double aDouble) {
System.out.printf("anonymous a20.call(%s,%s)%n", integer, aDouble);
}
};
Action2<Integer, Double> a21 = (i, d) -> System.out.printf("lambda a21.call(%s,%s)%n", i, d);
// executions
a20.call(10,11.3);
a21.call(5,5.6);
}
}
والنتيجة هي كما يلي:
6.3. المثال-04، 05: الواجهة الوظيفية [Funci]
![]() |
الواجهة [Func0] هي كما يلي:
![]() |
هذه المرة، تُرجع طريقة [call] الخاصة بالواجهة نتيجة من النوع R.
سنوضح الواجهة باستخدام الشفرة التالية:
package dvp.rxjava.lamdbas;
import rx.functions.Func0;
public class Exemple04 {
public static void main(String[] args) {
// Function0
Func0<String> f00 = new Func0<String>() {
@Override
public String call() {
return "anonymous f00.call";
}
};
Func0<String> f01 = () -> "lambda f01.call";
// executions
System.out.println(f00.call());
System.out.println(f01.call());
}
}
مما ينتج عنه النتائج التالية:
بشكل عام، [Funci] (0<=i<=9) هي واجهة وظيفية ذات توقيع طريقة واحدة: R call(T1 t1, T2 t2, ..., Ti ti). فيما يلي مثال على [Func2] (مثال 05):
package dvp.rxjava.lamdbas;
import rx.functions.Func2;
public class Exemple05 {
public static void main(String[] args) {
// Func2
Func2<Integer, Double, String> f20 = new Func2<Integer, Double, String>() {
@Override
public String call(Integer integer, Double aDouble) {
return String.format("anonymous f20.call(%s,%s)", integer, aDouble);
}
};
Func2<Integer, Double, String> f21 = (i,d) -> String.format("anonymous f21.call(%s,%s)", i, d);
// displays
System.out.println(f20.call(10,10.2));
System.out.println(f21.call(100, 100.3));
}
}
مما يعطي النتائج التالية:







