13 Ekim 2017 Cuma

Temel RxJava (3)

Operatörler

Rxjava yı geleneksel java koduna göre bir adım öne geçiren olayın , yayınlanan datayı işlemek için çok geniş metod seti olduğundan ilk yazdımda bahsetmiştim . Bu yazımda bunlardan birkaçını açıklamaya çalışacağım .

flatMap()

Bir observable ın sonucunda oluşan değer tekrar başka bir observable a bağlanıyorsa . Yani asenkron bir işlem sonucu aslında başka bir asenkron işlem sonucuna bağlıysa içiçe iki tane observable yazmaktansa flatmap kullanılır .


Single.fromCallable(new Callable() {
            @Override
            public Integer call() throws Exception {
                return 1;
                //return 2;
            }
        }).flatMap(new Function>() {
            @Override
            public SingleSource apply(Integer integer) throws Exception {

                if (integer == 1)
                    return Single.just("fisrt");
                else
                    return Single.just("second");
            }
        }).subscribe(new Consumer() {
            @Override
            public void accept(String s) throws Exception {
                Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
            }
        });
Ekran Çıktısı : "first"
Örnekte ilk olarak Integer dönen bir observable oluşturulmuştur . Başka bir observable bunu dinlemektedir ve dönen sonuca göre String bir değer dönmektedir .

reduce()

Bir Observable birden çok değer üretiyor ve sonuc olarak bu değerlerin toplamı lazımsa reduce kullanılabilir .


  Observable.create(new ObservableOnSubscribe>() {
            @Override
            public void subscribe(ObservableEmitter> e) throws Exception {


                ArrayList strings = new ArrayList<>();
                strings.add("Hello");
                strings.add("Bro");
                e.onNext(strings);

                strings = new ArrayList<>();
                strings.add("Whats");
                strings.add("Up");
                e.onNext(strings);
                e.onComplete();

            }
        }).reduce(new BiFunction, List, List>() {
            @Override
            public List apply(List strings, List strings2) throws Exception {
                strings.addAll(strings2);
                return strings;
            }
        }).subscribe(new Consumer>() {
            @Override
            public void accept(List strings) throws Exception {
                Toast.makeText(MainActivity.this, strings.toString(), Toast.LENGTH_SHORT).show();
            }
        });

Ekran Çıktısı : [Hello,Bro,Whatsup,Kro]

onNext ile yayınlanan her "strings" listesi reduce methoduna girer ve orada parent strings e eklenir . Subsribe ise onComplete den sonra çalışır ve sonuç olarak iki onNext metoduyla yayınlanmış olan listelerin artarda eklenmiş halini alır .

1 yorum:

  1. Merhaba Gürkan Bey, ReactiveX'i inceliyordum yazılarınız çok güzel ve açıklayıcı olmuş elinize sağlık. Ancak son reduce örneğinizde subscribe parametresi olarak "ObservableEmitter>" yazmışsınız bir hata var sanırım orası şöyle
    "ObservableEmitter> e" aynı şekilde bir üstünde de "ObservableOnSubscribe> e" olması gerekiyor.

    YanıtlaSil