6. رابطهای کاربردی کتابخانه RxJava
کلاس Observable اساس کتابخانه غیرهمزمان RxJava را تشکیل میدهد. این کلاس شباهتهای زیادی به کلاس Stream دارد که به تازگی در مورد آن بحث کردیم. این کلاس نیز مانند آن، حاوی تعداد بسیار زیادی متد—چندین دوجین—است. و مانند آن، این متدها نمونههایی از رابطهای تابعی را بهعنوان پارامتر میپذیرند. ما با ارائهٔ رایجترین آنها شروع میکنیم: [Actioni] و [Funci].
6.1. مثال-۰۱: رابط تابعی [Action0]
![]() |
رابط [Action0] به شرح زیر است:
![]() | ![]() |
- رابط [Action0] دارای یک متد واحد به نام `call` با امضای [2]: `void call()` است. این رابط از رابطهای [Action] و [1, 3] ارث میبرد. رابط [Action] هیچ متدی ندارد. این نوع رابطها به عنوان رابطهای نشانگر [4] شناخته میشوند. آنها عمدتاً برای نوشتن استفاده میشوند: if(c instanceOf(Action)) {...}. رابط [Action] خود از رابط نشانگر [Function] [4-6] مشتق میشود؛
![]() |
ما رابط [Action0] را با کد زیر (Example01) نشان خواهیم داد:
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");
// مشاهدهها
a01.call();
a02.call();
}
}
- خطوط ۸–۱۳: پیادهسازی رابط [Action0] با استفاده از یک کلاس ناشناس؛
- خطوط ۸–۱۳: پیادهسازی رابط [Action0] با استفاده از لامبدا؛
نتایج به شرح زیر است:
6.2. مثال-۰۲، ۰۳: رابط تابعی [Actioni]
![]() |
رابط [Action1] به شرح زیر است:
![]() |
ما این را با کد زیر (مثال 02) نشان خواهیم داد:
package dvp.rxjava.lamdbas;
import rx.functions.Action1;
public class Exemple02 {
public static void main(String[] args) {
// اقدام۱
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] (Example03) آورده شده است:
package dvp.rxjava.lamdbas;
import rx.functions.Action2;
public class Exemple03 {
public static void main(String[] args) {
// اقدام۲
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. مثالهای ۰۴ و ۰۵: رابط عملکردی [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";
//اجراها
System.out.println(f00.call());
System.out.println(f01.call());
}
}
که نتایج زیر را تولید میکند:
بهطور کلی، [Funci] (0<=i<=9) یک رابط تابعی با یک امضای متد واحد است: R call(T1 t1, T2 t2, ..., Ti ti). در اینجا مثالی برای [Func2] (Example05) آورده شده است:
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);
// دیدها
System.out.println(f20.call(10,10.2));
System.out.println(f21.call(100, 100.3));
}
}
که نتایج زیر را تولید میکند:







