flatmap etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
flatmap etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

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 .