Having seen different ways of creating various types of
Observable objects, subscribing to their events, and using the
Subscription objects, we turn to composing
Observable objects into larger programs. From what we have seen so far, the advantages of using
Observable objects over a callback-based API are hardly worth the trouble.
The true power of Rx becomes apparent when we start composing
Observable objects using various combinators. We can think of an
Observable object in a similar way as we think of Scala sequence collections. In a Scala sequence, represented with the
Seq[T] trait, elements of type
T are ordered in the memory according to their indices. In an
Observable[T] trait, events of type
T are ordered in time.
Let's use the
Observable.interval factory method in order to create an
Observable object, which asynchronously emits a number every 0.5 seconds, and then output the first five odd numbers. To do this, we first call
filter on the