前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RxJava初步进阶-操作符

RxJava初步进阶-操作符

作者头像
PhoenixZheng
发布2018-09-29 11:40:00
4690
发布2018-09-29 11:40:00
举报
文章被收录于专栏:Phoenix的Android之旅

在上两篇介绍中我们把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 中对于数据操作的接口定义。

代码语言:javascript
复制
/**
 * 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()的作用非常简单,直接看代码比看定义来的快

代码语言:javascript
复制
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类型

代码语言:javascript
复制
Observable.from(new Integer[]{1, 2, 3, 4, 5});
filter()

顾名思义这是个过滤的操作符,比如我们要过滤数据中的偶数,只拿奇数的话

代码语言:javascript
复制
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()。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-09-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Android每日一讲 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Operator
  • just() 和 from()
  • filter()
  • skip()和take()
  • merge()
  • 高阶操作符
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档