转载请注明出处:https://zhuanlan.zhihu.com/p/20687178java
RxJava系列3(转换操做符)github
提高开发效率,下降维护成本一直是开发团队永恒不变的宗旨。近一年来国内的技术圈子中愈来愈多的开始说起Rx,通过一段时间的学习和探索以后我也深深的感觉到了RxJava的魅力。它能帮助咱们简化代码逻辑,提高代码可读性。这对于开发效率的提高、后期维护成本的下降帮助都是巨大的。我的预测RxJava必定是2016年的一个大趋势,因此也有打算将它引入到公司现有的项目中来,写这一系列的文章主要也是为了团队内部作技术分享。ide
因为我本人是个Android程序猿,所以这一系列文章中的场景都是基于Android平台的。若是你是个Java Web工程师或者是其它方向的那也不要紧,我会尽可能用通俗的语言将问题描述清楚。post
在介绍RxJava前,咱们先聊聊响应式编程。那么什么是响应式编程呢?响应式编程是一种基于异步数据流概念的编程模式。数据流就像一条河:它能够被观测,被过滤,被操做,或者为新的消费者与另一条流合并为一条新的流。
响应式编程的一个关键概念是事件。事件能够被等待,能够触发过程,也能够触发其它事件。事件是惟一的以合适的方式将咱们的现实世界映射到咱们的软件中:若是屋里太热了咱们就打开一扇窗户。一样的,当咱们的天气app从服务端获取到新的天气数据后,咱们须要更新app上展现天气信息的UI;汽车上的车道偏移系统探测到车辆偏移了正常路线就会提醒驾驶者纠正,就是是响应事件。
今天,响应式编程最通用的一个场景是UI:咱们的移动App必须作出对网络调用、用户触摸输入和系统弹框的响应。在这个世界上,软件之因此是事件驱动并响应的是由于现实生活也是如此。
本章节中部分概念摘自《RxJava Essentials》一书
Rx是微软.Net的一个响应式扩展,Rx借助可观测的序列提供一种简单的方式来建立异步的,基于事件驱动的程序。2012年Netflix为了应对不断增加的业务需求开始将.NET Rx迁移到JVM上面。并于13年二月份正式向外展现了RxJava。
从语义的角度来看,RxJava就是.NET Rx。从语法的角度来看,Netflix考虑到了对应每一个Rx方法,保留了Java代码规范和基本的模式。
那么到底什么是RxJava呢?我对它的定义是:RxJava本质上是一个异步操做库,是一个能让你用极其简洁的逻辑去处理繁琐复杂任务的异步事件库。
Android平台上为已经开发者提供了AsyncTask,Handler等用来作异步操做的类库,那咱们为何还要选择RxJava呢?答案是简洁!RxJava能够用很是简洁的代码逻辑来解决复杂问题;并且即便业务逻辑的愈来愈复杂,它依然可以保持简洁!再配合上Lambda用简单的几行代码分分钟就解决你负责的业务问题。简直逼格爆表,拿它装逼那是极好的!
多说无益,上代码!
假设咱们安居客用户App上有个需求,须要从服务端拉取上海浦东新区塘桥板块的全部小区Community[] communities,每一个小区下包含多套房源List<House> houses;咱们须要把塘桥板块的全部总价大于500W的房源都展现在App的房源列表页。用于从服务端拉取communities须要发起网络请求,比较耗时,所以须要在后台运行。而这些房源信息须要展现到App的页面上,所以须要在UI线程上执行。(此例子思路来源于扔物线的给Android开发者的RxJava详解一文)
new Thread() { @Override public void run() { super.run(); //从服务端获取小区列表 List<Community> communities = getCommunitiesFromServer(); for (Community community : communities) { List<House> houses = community.houses; for (House house : houses) { if (house.price >= 5000000) { runOnUiThread(new Runnable() { @Override public void run() { //将房子的信息添加到屏幕上 addHouseInformationToScreen(house); } }); } } } } }.start();
使用RxJava的写法是这样的:
Observable.from(getCommunitiesFromServer()) .flatMap(new Func1<Community, Observable<House>>() { @Override public Observable<House> call(Community community) { return Observable.from(community.houses); } }).filter(new Func1<House, Boolean>() { @Override public Boolean call(House house) { return house.price>=5000000; } }).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<House>() { @Override public void call(House house) { //将房子的信息添加到屏幕上 addHouseInformationToScreen(house); } });
从上面这段代码咱们能够看到:虽然代码量看起来变复杂了,可是RxJava的实现是一条链式调用,没有任何的嵌套;整个实现逻辑看起来异常简洁清晰,这对咱们的编程实现和后期维护是有巨大帮助的。特别是对于那些回调嵌套的场景。配合Lambda表达式还能够简化成这样:
Observable.from(getCommunitiesFromServer()) .flatMap(community -> Observable.from(community.houses)) .filter(house -> house.price>=5000000).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(this::addHouseInformationToScreen);
简洁!有美感!这才是一个有情怀的程序员应该写出来的代码。
看完这篇文章你们应该可以理解RxJava为何会愈来愈火了。它能极大的提升咱们的开发效率和代码的可读性!固然了RxJava的学习曲线也是比较陡的,在后面的文章我会对主要的知识点作详细的介绍,敬请关注!
若是你们喜欢这一系列的文章,欢迎关注个人知乎专栏和GitHub。