Skip to content

6. RxJava kütüphanesinin işlevsel arayüzleri

Observable sınıfı, asenkron RxJava kütüphanesinin temelini oluşturur. Bu sınıf, az önce tanıttığımız Stream sınıfıyla birçok benzerlik gösterir. O sınıf gibi, bu sınıf da onlarca yöntem içerir. Ve tıpkı o sınıf gibi, bu yöntemler de işlevsel arayüz örneklerini parametre olarak kabul eder. Öncelikle bunlardan en yaygın olanlarını tanıtacağız: [Actioni] ve [Funci].

6.1. Örnek-01: [Action0] işlevsel arayüzü

  

[Action0] arayüzü şu şekildedir:

  • [Action0] arayüzü, [2] imzalı tek bir call yöntemine sahiptir: void call(). Bu arayüz, [Action] ve [1, 3] arayüzlerinden türetilmiştir. [Action] arayüzünün herhangi bir yöntemi yoktur. Bu tür arayüzlere [4] işaretleyici arayüzleri denir. Bunlar esas olarak şu şekilde yazmak için kullanılır: if(c instanceOf(Action)) {...}. [Action] arayüzü ise [Function] [4-6] işaretleyici arayüzünden türetilmiştir;
 

[Action0] arayüzünü aşağıdaki kodla (Örnek01) açıklayacağız:


package dvp.rxjava.lamdbas;

import rx.functions.Action0;

public class Exemple01 {
  public static void main(String[] args) {
    // Eylem0
    Action0 a01 = new Action0() {
      @Override
      public void call() {
        System.out.println("anonymous a01.call");
      }
    };
    Action0 a02 = () -> System.out.println("lambda ao2.call");
    // görüntüleme sayısı
    a01.call();
    a02.call();
  }
}
  • 8-13. satırlar: [Action0] arayüzünün isimsiz bir sınıfla uygulanması;
  • 8-13. satırlar: [Action0] arayüzünün bir lambda ile uygulanması;

Sonuçlar şöyledir:

anonymous a01.call
lambda ao2.call

6.2. Örnek-02, 03: [Actioni] işlevsel arayüzü

  

[Action1] arayüzü şöyledir:

 

Bunu aşağıdaki kodla (Örnek 02) göstereceğiz:


package dvp.rxjava.lamdbas;

import rx.functions.Action1;

public class Exemple02 {
  public static void main(String[] args) {
    // Eylem1
    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));

    // çalıştırmalar
    a10.call(20);
    a11.call(17.4);
  }
}

Bu kod şu sonucu verir:

anonymous a10.call (20)
lambda a11.call (17.4)

Genel olarak, [Actioni] (0<=i<=9), tek imza yöntemine sahip işlevsel bir arayüzdür: void call(T1 t1, T2 t2, ..., Ti ti). [Action2] (Örnek03) için bir örnek aşağıda verilmiştir:


package dvp.rxjava.lamdbas;

import rx.functions.Action2;

public class Exemple03 {
  public static void main(String[] args) {
    // Eylem2
    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);
    // çalıştırmalar
    a20.call(10,11.3);
    a21.call(5,5.6);
  }
}

Elde edilen sonuç şöyledir:

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

6.3. Örnek-04, 05: [Funci] işlevsel arayüzü

  

[Func0] arayüzü şu şekildedir:

 

Bu sefer, arayüzdeki [call] yöntemi R türünde bir sonuç döndürür.

Arayüzü aşağıdaki kodla göstereceğiz:


package dvp.rxjava.lamdbas;

import rx.functions.Func0;

public class Exemple04 {
  public static void main(String[] args) {
    // İşlev0
    Func0<String> f00 = new Func0<String>() {
      @Override
      public String call() {
        return "anonymous f00.call";
      }
    };
    Func0<String> f01 = () -> "lambda f01.call";
    // çalıştırmalar
    System.out.println(f00.call());
    System.out.println(f01.call());
  }
}

Bu kod, aşağıdaki sonuçları verir:

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

Genel olarak, [Funci] (0<=i<=9), tek imza yöntemine sahip işlevsel bir arayüzdür: R call(T1 t1, T2 t2, ..., Ti ti). [Func2] (Örnek05) için bir örnek aşağıda verilmiştir:


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);
    // görüntülemeler
    System.out.println(f20.call(10,10.2));
    System.out.println(f21.call(100, 100.3));
  }
}

bu, aşağıdaki sonuçları verir:

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