java运算符学习收获 RxJava初步进阶-操作符
在上两篇介绍中我们把RxJava的基本概念和基本原理说明了。它为什么会大行其道,主要是因为它在线程切换,代码逻辑简洁度有非常好的体验。
如果你还不了解RxJava的特点的话,可以参考这两篇文章
五分钟带你感受RxJava的优雅
零基础理解RxJava和响应式编程
RxJava的优点不仅在线程切换和代码逻辑简洁性上。甚至可以说,相比起另一个特性,这些优点都算小巫见大巫。
这个特性就是变换。
变换这个词能比较恰当的描述RxJava的核心特性,但是要理解它需要很多准备知识。变换,是基于一个叫 lift() 的 api衍生出来的一堆api,要理解 lift()很不容易,
下面是RxJava源码中对于 lift()的注释的第一句话
This method requires advanced knowledge about building operators; please consider other standard composition methods first
RxJava的开发者都不建议一上来就去学 lift()的原理。
所以这篇文章先介绍一些基本的 api,在形成一定的概念和印象之后我们才进一步来接触RxJava的核心。
Operator
operator - 操作符,是 RxJava 中对于数据操作的接口定义。
/** * Operator function for lifting into an Observable. * @param <T> the upstream's value type (input) * @param <R> the downstream's value type (output) */ public interface Operator<R, T> extends Func1<Subscriber<? super R>, Subscriber<? super T>> { // cover for generics insanity }
单看operator也是一个很抽象的东西。可以这么具象化地来理解它,
RxJava把所有逻辑代码看成异步源和数据加观察者,对于数据的操作是通过各种 operator 来进行的。
比如网络请求,就是个异步源,以天气请求为例子,它可能返回多个城市的天气数据,我们可以对这些数据进行过滤(filter)取某些城市的值,或者单独取第一个城市的值(take)。
filter 和 take 都是操作符。
操作符是了解RxJava核心的切入点,在这之前我们看看RxJava都给我们封装了哪些操作符。
just() 和 from()
just()的作用非常简单,直接看代码比看定义来的快
Observable.just(1, 2, 3, 4, 5) .subscribe(new observer<Integer>() { .... @Override public void onNext(Integer integer) { //依次接受到12345 } });
注意这里省略了onCompleted和onError方法。
just()简单的把原始数据分发给 Observer,不作任何处理。
from()跟 just()几乎一样,区别只是 from()的参数是 array类型
Observable.from(new Integer[]{1, 2, 3, 4, 5});
filter()
顾名思义这是个过滤的操作符,比如我们要过滤数据中的偶数,只拿奇数的话
Observable .just(1, 2, 3, 4, 5) .filter(new Func1<Integer, Boolean>() { @Override public Boolean call(Integer integer) { //检查是否奇数,奇数返回true,偶数返回false,false的会被过滤掉 return integer % 2 != 0; } });
这样在 observer 中就只会收到奇数。
skip()和take()
这两个差不多,就放到一起讲。用代码说明不如用图片说明,
skip(int n) 意思是跳过前n个数据,
take(int n) 表示只取前n个数据
merge()
merge()是一个非常有意思的operator,它把两个异步源的数据合并之后再发送给observer。
它的特别之处在于发送的顺序并不是把两个异步源的数据前后发送,而是混合到一起发送。用图片表示
高阶操作符
到这里我们还没有真正涉及到变换的概念。可能有些同学就要喷我了,
特么看了一整篇还没不讲重点?
别急,这篇的重点是在于知道 operator,而变换是在operator的基础上的。对操作符有了概念,才不至于在学变换的时候不知所云。
下篇我们要开始了解变换了,会从两个操作符开始,
map()和flatmap()
而这两个方法离不开上面介绍的最后一个操作符-merge()。
,
免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com