Skip to content

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

والنتائج هي كما يلي:

anonymous a01.call
lambda ao2.call

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

مما يعطي النتيجة التالية:

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

والنتيجة هي كما يلي:

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

مما ينتج عنه النتائج التالية:

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] (مثال 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));
  }
}

مما يعطي النتائج التالية:

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