Skip to content

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] با استفاده از لامبدا؛

نتایج به شرح زیر است:

anonymous a01.call
lambda ao2.call

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);
  }
}

که نتیجه زیر را تولید می‌کند:

anonymous a10.call (20)
lambda 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);
  }
}

نتیجهٔ حاصل به شرح زیر است:

anonymous a20.call(10,11.3)
lambda 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());
  }
}

که نتایج زیر را تولید می‌کند:

anonymous a20.call(10,11.3)
lambda a21.call(5,5.6)

به‌طور کلی، [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));
  }
}

که نتایج زیر را تولید می‌کند:

anonymous f20.call(10,10.2)
anonymous f21.call(100,100.3)