Skip to content

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

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

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) {
    // الإجراء 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);
  }
}

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

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) {
    // الإجراء 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);
  }
}

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

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) {
    // الوظيفة 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());
  }
}

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

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) {
    // الوظيفة 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));
  }
}

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

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