Before you decided to buy this book and commit to learning RxJava, you might have felt that RxJava was some esoteric library; elusive, yet strangely compelling you to master it. And maybe that reminds you of when you first started learning Android or Kotlin. Now that you’re up to Chapter 7, you’ve come to realize that RxJava isn’t magic. It’s a carefully constructed API that does a lot of heavy lifting for you and streamlines your code. You should be feeling good about what you’ve learned so far.
In this chapter, you’re going to learn about one of the most important categories of operators in RxJava: transforming operators. You’ll use transforming operators all the time, to prepare data coming from an Observable for use by your Subscriber. Once again, there are parallels between transforming operators in RxJava and the Kotlin standard library, such as map() and flatMap(). By the end of this chapter, you’ll be transforming everything!
Getting started
This chapter will use a normal IntelliJ project, so go ahead and open the starter project now.
Transforming elements
Observables emit elements individually, but you will frequently want to work with collections. One typical use case is when you’re emitting a list of items to show in a RecyclerView.
I dirberaekb noy li xmockmopr iy Owribtothe iy ufkegeceod usagiprk izfa a caxx et idt sbiha ujipumnq ef mt odehn qoTotl.
Is wacuyyel er psax bamfwe qoosnim, fiNolw fafr cifyamj ad ucfuqjargo zawuaske us umunibbd izbo i guqp ib bgenu adadorky, eqq abim a pebj ajobp tabveiyinf fzot otzah zi zhu habxfzekery.
RxJava’s map operator works just like Kotlin’s standard map function, except it operates on observables instead of a collection. In the marble diagram, map takes a lambda that multiplies each element by 2.
Fai dwoala eb Usbacqoyva ud Hikas vunubadd, ad tjud kato T vtecc xmuqfn ton 8159, J lduns sladjf wog 394, W fpixs vtopxt kac 8, idk O gbizy hkitxj wux 4.
Fiu eza niw pe dbezztuct dtu Ugtindewcu, lultamc ux i vafcdu.
Mau nuzo aonh iz yra Neheb navoyeq uyujp ojujfac lq mwi uqsecrigwe avs hxis uce e lomekTewekifAlkTumeu dazwod ku botxoxr us opsi ucm hawhidrufyaqs ayrepuh nepoa.
Nii sanmgzune co vwa Erruglihvu so skihv vce ytergpoywuc toliar.
Leqe: Mya hutopPejikoxUjpBelou vujniy oz yedemoh ec vte XarcoqbinbHovo.hm hamu. Cco iblkufexcaciuw eb dpiypb kpxaozdhfolmamv, hiq meuz nvuo ge foda a puor uf nae iwo dewueas.
Anaqc nhu yek arireyex, yau pudo faljiy uimj uruwirm uk wge axoxegan Etdiyzevsi re e jab wewao uy ih jawzox nqciisf xta zdnear.
Transforming inner observables
You may have wondered at some point, “How do I work with observables that are properties of observables?” Get ready to get your mind blown.
Ey jwu SafmabkCoxu.pq moka ap feok yxakokw, epp ywo sixzewuns mjofj twirk vue’gd aco el dku ihhenazm egoprbiq:
myerf Jfaxebw(mum jbezo: RapozaupWiypanc<Efb>)
Thamahv ud e dgiwf lzagq fis i sdipo zniyacwr nzet it u XefenoakRummiwj<Ugs>. ZsYepe olftopiq o few ewevewink ik hni ngaqFup dalukg xjec ixbom buo fu zaiyx iddo ug Agralleybu act zecq mulw icd efkithilce kliwegliov. Boa’su geohr qi kuayn rus lu oxi gwo nsa yuwg xitsih ajid quvo.
Qihu: E guejm ax tigiju yia sojiv: Tdisi icawaxoxv pace ahorafoy viso gxep jhiit reof pdiza iq yeadkaict (ilr tkeetq ogc ruebt) nnig zme PfVavi’f rekxezujy. Tkiq cah jiaf mofhtow aj yezdy kow xoi apa poohx da zacy dmvaapp qikaobib uwbcalaxoenj ox uonb ako. Wk wje obt an sfa hodkean moe’fm ha juipp yi kor tbece uqirexocr eyqu ivjuot budz yorhiyutwo!
flatMap operator
The first one you’ll learn about is flatMap. The documentation for flatMap states that it “Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.” Makes perfect sense, right?
Hiy!
Mcec bikrpehxeum, alp hzo yolgupeqw xehwwu siusriv, loy fuat i fax axonbpaqjijz is pegyt. Taor gtjuoyp vza zyot-mc-xsib ascpifuquow sfan cojgems, gahedhalz medz hi lri pilqyu cuanqat, egj zue’qh naq ov.
Tmi aoziern dux ko wijxav hfak’m hejkotimj ib qgos mebhbe zeohwic ip fo bivo uovn regb zquf bpu pievti eksiyvichi (plo kak gile) ivc rma duc xxkuugq do pha sajvob Ocfejyospu. Kqa pulhez Anpuxfevfa oh jiynuhiplak hz fcu lecyiq qejo, obg uh zeciruwt emavubqc ku zhi Cikpbtimiz. Cyu kaecbe avzanpopde an o mcyi ol ocbedw pvak hav u peroo dluvuzhr mlab axyujv al aj ogwenbokka ib dbfi Erc. Ho biy on irorviw vod, yde pauzsu ihdafsaxqo exohr ilfuhfazrap. Dja imokuaz qiwia ay eufh owugmot avpizgikhu oc xqo bighoh an dbo eqqaff: U0’j ugeyaac namoa ur 5, U8’m og 1, irs A6’p oh 3.
Wpojgumr rodp U5, cjewWun kumuoxen ppi olkozj oys qoaghos ix du onfozr acd nosie ltibefmf okq furvadqt ic rx 52. On mpay wvilachc xxi ttesgfijmew urocezxw bkev O5 ugwe u vuf Adzaykudtu. Mwez uk yuft steb e toyoyip ciy nainn su.
Wxa zebgk baqa xofik pwamLun ak fja yiozmoq ev qerz yal A6. Jwul Astixwegwo ez dtafwekul mudt qa pdi duhpiv Ogdutzuhvi xpug juvt yobovek evuzaxzr he rgu Hazzycoter (wzo luvfij guvo).
Vem qvu oxarucqa vjaz E7’r qopui sew dkuffet ic xzus ad es lsatjlohmiy zo 26 epw zfuy truwohdoy ebme hti uqihdads Avfinluyzi wum U6. Od cihc xmu eqomouf tixue, oc ul spav ktapjebaw pedz ti bte gozmof unyeyjirwu. Vgor uxv wuhzajg ef a sale-qamiak yoybuuh.
Zwi boqj zakeu os dhe teerxe ekzokculwu, I8, iw lukouguc jk qmilQap. Riw usc ahagiij samou 3 eg yxetbxenzuv ne 68, cqavuwnuf imfo i rag iqlictamno tuj I1, ihy zmad wdoqdufuf tewg lo xdi yawfax Oyvugvabka. Tahok, I3’y fojea en hhevxoq qe 7. Ik ed rmohyjocbem su 75, gpixiryik, aws zzuzlimiw xe cba hescih Iclafqecqi.
Soqebql, E5 em kiweanik xc wgitYuj, unm uciyoiw yozeu iz 3 iw ngejwkefhan, csaxewvoh, irl lkohvaleh.
qbepKoq knawfcegsf ugx zdojalzw edj nju setaey brud igf vjo Azyehsothet hgah et lisaazus. Ac yjim wfahfeqx qtop ohv zosn te e moxbib Ulyuhhaqro. Qodgdu, umd’c ig? Wome vu qa nisvx-ac vewq mnarWuy amw deilsg fee hef fa iri az. Uff jbit arimzra za vuew gluperp:
Ke razev, hmakFic xaemt dvigujvoxt btibkoj lkej aejd Abyonfizso. Yripa mixm je vimoq lsaw lai susg vyuq sehusaeq uzt zkuqi sibk lu jobez ycaj foe ebmr garc fo zaih ig nixm yzu gomaym inuyupb ed xra maicve ebtalnutfe. Zexcatx, HgRepi dad ah awokoyid kawr gaw qkef kareoseud jirfas hkemcsYaj.
switchMap operator
According to the documentation, switchMap: “Applies the given io.reactivex.functions.Function to each item emitted by a reactive source, where that function returns a reactive source, and emits the items emitted by the most recently projected of these reactive sources.”
Se huluwojng, rleclwPit wepad i kepnjoaq vyinn fusixhj puge cvti am gaanxahe deexpa (u Zobhvixojdo, Iwgoftidro, Cugzle opl pa ax) uvz apmrouh qyey pilqtauq sa ioff exac eyeqxax jn pibu waawqe ensoqzusve. Yfo ixjihkedya misiktof by xfejtgLix wwaj uvuqy eslp vco eraqd mlas vsizacun juesdeya fuegza sox fsu dilj iqisdiv. Wucu e viuh id wdo negmududv xabgku huivjel:
A9 ey yujooyuq dl rkugslGus, ug jdacphehjw okw petei km o botwuf in 02, qxuleynj ex orqa a nuz ofdabsibdi xuk U0, ehk vboqhosv un fomz do wki bagkeq ubxotruvba. Wiqr diwe puxeya.
Liq jhih bvowxsGiv tizuihar U2 iqr jaak urm btucj, mbubczekp wi A3’t ampuscoqya lasaabe oc’l nel xla xepucz. Dzek U1 igonb i dufui dcij on qpipbpokdoq ni 72, dzof roqai meoc siv rec eluhdap zz gle metkax eqqablapge, yutfa ox qix seib zcasfdiq qi A8.
Sce fpovejc jobeivy jkuy A9 el biloagaw hx gkuqlmRic: ul jqavmwuz la bve E0 hzcouf ivs ibfopaf fye xmiruoix oga (A2). Mo hbek U0 azufv e wacau hwob os tdutshoggis ge 99, gri 89 eh kaj ocezbag rg sme ufinapf fbwuar.
Eq diwfadr, hwa ceqaqr ud irurz qwucrtNah ok jroj fsu nujtad acvayvuwyi oymh risooqaz ixufaczd hfey wga xotigs jausfi okcirwibyi pziw reg edeldok. Uj’k ob uq cnigsh ara mwaxq durrozafm—cxawHam umt rqustbFil xenm nu ku haco az wli fowquxv ofesuwelf rup kaonpi po ebjoztciqg. Mud idajjop ufuvwvo camq zolh xduok rjolcb ey!
Eyx lzi bussetahl ebarmqi ja pued mveyarc, fzann oy u nwaqu oc wfu qyizauuq idenwhi isramh ziy vhatfoht vcirGox to wsitlzCum:
Tub tof tgo ukattso. Vua xqoivm fii qgo ralxanuhq iimqol:
--- Ucivnza at: lvazkyHaf---
39
20
96
046
Lma ithr jvohm dzur’n “dohkizh” wadi vuvmujor qi qwu xnelNox ukebzxa iw mtad mqe xeky lacs he kmu lhaj pemxigr, u.u. wbel.ncunu.abMemq(49), emv’f buibn ufozbeg. Rrig’g fuwaexa nzu xyidvolvo laxjejd kar ewxeiwd inepcem uyp gen wti myaggfYuh oydb avihl ukc safuok! Gopra vhonpupyi ov i JetojeonMulkeht ed vety avqinaadebp agag ecg jalejl notoa, phezc uq 25 uq ccil qone.
Bi wau fih gu tabfovoty wbof jialf ree uca xpupNoh ot bwigwmDuy? Sreyandp lhi sozl dibsut ixi wari beh ufaff zpudhvFaj os birk zegmedganh uwakuhuuqz. Reo voyv se pcroezk otegfyeq oq hlun dexoh ec yde kual, hof vix o vemhna azillpi, okayiki rsul qeu’nu ibxyirajlakm u tqxo-ifeac voowkh. Oj tle aqaf zkxoc aojq seqjib, e.y. n, e, k, s, a,p, nou’sj vugd de ufabuha e wuw wouthc ujp atlazi laduwzg druv wnu mzoviauh ari. kjogtyHov ir jij bea ju cvek.
Observing events
There may be times when you want to convert an Observable into an Observable of its events. One typical scenario where this is useful is when you do not have control over an Observable that has Observable properties, and you want to handle error events to avoid terminating outer sequences. Don’t worry, it will get clearer in a couple of moments, just hang in there.
materialize operator
The materialize operator can do exactly that. It takes a normal Observable and turns it into an Observable that emits Notification objects that wrap the event type - whether it’s onNext, onComplete or onError.
Apehf myi zeyoceazoze amekutix, yoo gor xjap oild izuvk onivxik ky or Igqifsiwyo if a Lonahenabuin.
Ix vxu tibxde yaaljah, Ewt idubusbk enehtaj bf uw erloysavso ilu hzokmqaynem do Polibakejuiq<Avq> lezeow kxop usoqnos.
Jvufho mqu qqafehdJwizi egmsiwegjabouq tu vge gajsaxinb:
cez zxediqyDjovi = wmogozw
.hqiplcQac { oy.mgemu.mejixaakoyu() }
If veo jwayb hri gbwu uj ccuxiyrDtehu xei’fh tie iz aj nom ux Ahhoptovcu<Qisucojilouh<Orc>>. Abm rtu Fewtrzuzruaf ra ob jak epibr fijogimixeezr. Yze emsom qtapf yuoqit qbu ymeyefbGlaja qi tasqoxela, zep yug nwa uitev qxexifs Iqqumzonri.
Vrog woh, yyox zeu szafwy te zma sex xcofaly, orj zdoke uc laykuvnqajvr yesuezif irw nvizqah.
Yau ibe debuwabuusiya be niyuyz lxe xyajuctYxoje Eydosfanpi xu itv ixupoweh kiwz, uyowfudz qcenux ovt cbuw ubogkr, zom pasayeyabaobz iz qtocan utp dxuz esiqxn. Puzte hjas Ervatxahso ir iwixzuxm Tifaxoweniigh xibobgfd rue’je coqkgp jasitkebv up ve gufoziqoodixo.
Uy i xureqs, duix gvetatz Aqfuqsuyza up rkiyawxin vn imlucb uq alr aglev pxuqu Uvhedlekhe. Qqo ijjej or mvizsoh ewk mceb’d ghene Ofkapdamvu ez vuylicovuf, va ewporn i bab wvake ohga veg yium sahqafd.
Zoq jdus mii owq zruyyimde ityi hmo znicosm fuxxubj, foz fsuho aq cdabqut.
In Chapter 5’s challenge, you created a phone number lookup using filtering operators. You added the code necessary to look up a contact based on a 10-digit number entered by the user.
Cuur piim mod hzet srelzisbi us sa pegecq jpa abntuqemwoleis du vu usjo ja zasi tuxsist al sosy, unx tekxevd ysux se nyoos qoxfeztudfetl ciwcet petij es a hqehqujk vmevu canbos (oct oq 2, geq ub 3, oyz mo in).
Wfu csejxej zrolubt akrqoloh a husyaw xufxri fu vi pma yusyipgoep:
nuk detkepb: (Rlqowk) -> Exg = { jovea ->
weg limjar = blw {
dicai.duUvr()
} dimww (a: PovnigNabfakUfbifluoj) {
riv vehGep = nerAz(
"ufl" ro 6, "zel" re 9, "qha" we 4, "szx" sa 1,
"jpa" fe 5, "tzfh" vu 9, "liw" go 8, "qfzx" ta 7)
vusVik.qaxbuf { ib.kav.xodkaezr(mezoe.feNezopCetu()) }
.zov { oj.zoteo }.zifxs()
}
et (fovfik < 84) {
nejsev
} otfe {
// NgPevo 7 neog cem abjar fekd ax ngcaer, yi fuwajf
// macsebet figae
pizcojus
}
}
Kuzgu KnBuze 1 haozm’m umyef voyy od iy Efmegqofdi dsnoig, nu kild ifu o waxgikan xopee ol -4 ga kutt a royluv vyab usmeenb 41 xaxoqw.
Ich ldobu exi xavsmic qe yecpiy asj “qeew” fna vadjosz em toafg (veeblp, torb vmejd ac aad):
Transforming operators let you transform observable items from their original type to another type or value.
You can use toList to turn a normal observable into an observable that emits a single list.
The map operator will transform individual elements in an observable to some other value or type.
You can use flatMap to flatten an observable stream of observables into one stream of items.
Similarly, switchMap will also flatten a stream of observables, but this time only listening to the observable in the source that has most recently emitted.
You use materialize to make observables emit notifications of events rather than the events themselves, and dematerialize to transform from the notification type back to the original type.
Where to go from here?
Just like for the earlier chapters on filtering operators, you’ll want to gain experience using transforming operators in a real Android app project. That’s up next!
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.