In this chapter, we covered combining observables, which can be useful in a variety of ways. Merging is helpful in combining and simultaneously firing multiple observables and combining their emissions into a single stream.
The flatMap() operator is especially critical to know, as dynamically merging observables derived from emissions opens up a lot of useful functionality in RxJava.
Concatenation is similar to merging, but it fires off the source observables sequentially rather than all at once. Combining with ambiguous allows us to select the first Observable to emit and fire its emissions.
Zipping combines emissions from multiple observables, whereas combineLatest() combines the latest emissions from each source every time one of them fires.
Finally, grouping splits up an Observable into several GroupedObservable objects, each with emissions that have a common key.
...