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ğunu ilk yazımda anlatmıştım . 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) { 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 .
Not : Eğer birden fazla data yayınlıyorsanız ve asenkron çalışmasını istiyorsanız flatmap kullanabilirsiniz. Ama senkron çalışması gerekiyorsa -yayınlanan datalar sıra sıra işletilecekse- concatmap kullanmalısınız . Switchmap ise sadece yayınlanan son data ile ilgilenir öncekileri görmezden gelir.
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]
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 .
Yazının devamına linkten erişebilirsiniz.