6. الواجهات الوظيفية لمكتبة RxJava
تشكل الفئة Observable أساس المكتبة غير المتزامنة RxJava. وهي تشبه إلى حد كبير الفئة Stream التي عرضناها للتو. ومثلها، فإنها تحتوي على عدد كبير جدًا من الطرق، يصل إلى عدة عشرات. ومثلها، تقبل هذه الطرق مثيلات واجهات وظيفية كمعلمات. سنبدأ بعرض أكثرها شيوعًا: [Actioni] و [Funci].
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) {
// الإجراء 0
Action0 a01 = new Action0() {
@Override
public void call() {
System.out.println("anonymous a01.call");
}
};
Action0 a02 = () -> System.out.println("lambda ao2.call");
// عدد مرات العرض
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) {
// الإجراء 1
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));
// عمليات التنفيذ
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) {
// الإجراء 2
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);
// عمليات التنفيذ
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) {
// الوظيفة 0
Func0<String> f00 = new Func0<String>() {
@Override
public String call() {
return "anonymous f00.call";
}
};
Func0<String> f01 = () -> "lambda f01.call";
// عمليات التنفيذ
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) {
// الوظيفة 2
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);
// عمليات العرض
System.out.println(f20.call(10,10.2));
System.out.println(f21.call(100, 100.3));
}
}
الذي يعطي النتائج التالية:







