and
Write once, stream everywhere
Observable = Stream prototype
Operator = Stream transformation
Subscriber = Stream consumer
Future, Iterable, merge, concat, periodic, timer, ...
Transformations
map, filter, scan, groupBy, flatMap, takeUntil, delay, ...
Backpressure
debounce, throttle, buffer, window, sample, ...
Error handling
retry, catch, using, delayError, switchOnError, ...
val loadNext = list.scollEvents()
.debounce(100, TimeUnit.MILLISECOND)
.observeOn(Schedulers.ui())
.map { list.maxY - list.list.currentY }
.filter { remaining -> remaining < 2 * PAGE_HEIGHT }
Observable
.concat(
Observable
.range(1,100)
.map { page ->
Observable
.fromCallable { downloadPage(page) }
.retry(2)
.delaySubscription(loadNext)
}
)
.takeUntil { page -> page.isEmpty() }
.flatMap { page -> Observable.from(page) }
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.ui())
.filter { item -> ! list.contains(item) }
.subscribe(
onNext = { item -> list.add(item) },
onError = { e -> list.clear(); list.add(e) },
onCompleted = { list.add(FOOTER) }
)(Like Erlang, but on JVM)