Reactive Programming with RxJava-Chapter4:Applying Reactive Programming to Existing Application(1)

From Collections to Observables

BlockingObservable:Exiting the Reactive World

toList()

List<Person> people = personDao
            .listPeople()
            .toList()
            .toBlocking()
            .single()

Embracing laziness

defer()

public Observable<Person> listPeople(){
    return Observable.defer(() ->
        Observable.from(query("SELECT * FROM PEOPLE")));
}
void bestBookFor(Person person){
    recommend(person)
            .onErrorResumeNext(bestSeller())
            .map(Book::getTitle)
            .subscribe(this::display);
}

Composing Observables()

Lazy paging and concatenation

Obsevabel<Person> people=Observable
            .range(0,Integer.Max_VALUE)
            .map(this::listPeople)
            .takeWhile(list->!list.isEmpty())
            .concatMap(Observable::from);

Imperative Concurrency

Where to Subscribe
Pay attention to where you see subscribe() in domain code.Often your business logic is just composing Observables all the way down and returning then to some sort of framewoik or scaffolding layer.The actual subscription happens behind the scenes in a web framework or some glue code.It`s not a bad practice to call subscribe() yourself,but try to push it out as far as possible.

Whenever you see double-wrapped type(for example Optional

Observabel<Ticket> ticket= flight
        .zipWith(passenger,this::rxBookTicket)
        .flatMap(obs->obs);

You might perceive flatmap() as merely a syntactic trick to avoid a nested Observable< Observable<…> > problem,but it`s much more fundamental than this.

flatMap() as Asynchronous Chaining Operator

List<Ticket> failures = Observable.from(tickets)
    .flatMap(ticket ->
        rxSendEmail(ticket)
            .ingoreElements()
            //.flatMap(response -> Observable.<Ticket>empty())
            .doOnError(e -> log.warn("Failed to send {}",ticket,e))
            .onErrorRetrun(err -> ticket)
    .toList()
    .toBlocking()
    .single()

Attention
Remember that Observables are synchronous by default;however,we can easily change that and apply concurrency in places where it was least expected.This is especially valuable in existing legacy applications,which you can optimize without much hassle.

Wrapping up if you are implementing Obsrvables from scratch,making them asynchronous by default is more idiomatic.

最后,安利一款自己写的基于MVP的Android开发框架

https://github.com/sxenon/Pure
欢迎大家拍砖,如果觉得好,麻烦多多star

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值