RxJava——变换操作符

今天,对RxJava中的变换操作符进行学习。

一、变换操作符的作用

  1. 对事件序列中的事件/整个事件序列进行加工处理(

    变换

    ),使其转变成不同的事件/整个事件序列

  2. 具体原理如下:
    [图片上传失败...(image-d3d9ac-1512547008288)]

二、变换操作符的类型

RxJava中常见的变换操作符有

Map()

    FlatMap()

    ConcatMap()

    Buffer()

三、变换操作符的介绍

  1. Map()
    作用:对被观察者发送的每一个事件都通过制定的函数处理,从而变成另外一种事件。

[图片上传失败...(image-bc5634-1512547008289)]

    应用场景:数据类型转换

    具体使用:

以将事件的参数从整型转换成字符串类型为例

//采用RxJava基于事件流的链式操作

Observable.create(new ObservableOnSubscribe<Integer>){

    //1.被观察者发送事件 = 参数为整型 = 1,2,3

    @Override

    public void subscribr(ObservableEmitter<Integer> emitter) throws Exception{

        emitter.onNext(1);

        emitter.onNext(2);

        emitter.onNext(3);

    }

}).map(new Function<Integer,String>){

//2.使用Map变换操作符中的Function()函数对被观察者发送的事件进行统一变换:整型转换为字符型

    @Override

    public String apply(Integer integer) throws Exception{

        return 

"使用 Map变换操作符 将事件" + integer +"的参数从 整型"+integer + " 变换成 字符串类型" + integer ;

    }

}).subscribe(new Consumer<String>()){

    //3.观察者接收事件时,是接收到变换后的事件 = 字符串类型

    @Override

    public void accept(String s) throws Exception{

        Log.d(TAG,s);

    }

});

2.FlatMap()

作用:

    将被观察者发送的事件序列进行拆分&单独转换,再合并成一个新的        事件序列,最后再进行发送。

原理:

1.为事件序列中的每个事件都创建一个Observable对象

2.将对每个原始事件转换后的新事件都放入到对应的Observable对象

3.将新建的每个Observable都合并到一个新建的、总的Observable对象

4.新建的、总的Observable对象将新合并的事件序列发送给Observer

[图片上传失败...(image-68f1ab-1512547008289)]

应用场景:

无序的将被观察者发送的整个事件序列进行变换。

具体使用:

//

采用

RxJava

基于事件流的链式操作

Observable.

create

(

new

ObservableOnSubscribe<Integer>() {

@Override

public void

subscribe(ObservableEmitter<Integer> emitter)

throws

Exception {

    emitter.onNext(

1

);

    emitter.onNext(

2

);

    emitter.onNext(

3

);

}

}).flatMap(

new

Function<Integer, ObservableSource<String>>() {

@Override

public

ObservableSource<String> apply(Integer integer)

throws

Exception {

    final

List<String> list =

new

ArrayList<>();

    for

(

int

i =

0

; i<

3

; i++){

        list.add(

"

我是事件

"

+integer+

"

拆分后的子事件

"

+i);

    }

    return

Observable.

fromIterable

(list);

}

}).subscribe(

new

Consumer<String>() {

@Override

public void

accept(String s)

throws

Exception {

    Log.

e

(

TAG

,s);

}

});

3.ConcatMap()

作用:

类似于FlatMap()操作符。

    与FlatMap()的 区别在于:拆分 & 重新合并生成的事件序列 的顺序 = 被观察者旧序列生产的顺序

原理:

[图片上传失败...(image-8bcd75-1512547008289)]

应用场景:

    有序的

将被观察者发送的整个事件序列进行变换

具体使用:

//

采用

RxJava

基于事件流的链式操作

Observable.

create

(

new

ObservableOnSubscribe<Integer>() {

@Override

public void

subscribe(ObservableEmitter<Integer> emitter)

throws

Exception {

emitter.onNext(

1

);

emitter.onNext(

2

);

emitter.onNext(

3

);

}

}).ConcatMap(

new

Function<Integer, ObservableSource<String>>() {

@Override

public

ObservableSource<String> apply(Integer integer)

throws

Exception {

final

List<String> list =

new

ArrayList<>();

for

(

int

i =

0

; i<

3

; i++){

list.add(

"

我是事件

"

+integer+

"

拆分后的子事件

"

+i);

}

return

Observable.

fromIterable

(list);

}

}).subscribe(

new

Consumer<String>() {

@Override

public void

accept(String s)

throws

Exception {

Log.

e

(

TAG

,s);

}

});

4.Buffer()

作用:

定期从被观察者需要发送的事件中获取一定数量的事件放入缓存区中,最终发送。

原理:

[图片上传失败...(image-5bf8d4-1512547008289)]

应用场景:

    缓存被观察者发送的事件

具体使用:

//

被观察者需要发送

5

个数字

Observable.

just

(

1

,

2

,

3

,

4

,

5

).buffer(

3

,

1

)

    .subscribe(

new

Observer<List<Integer>>() {

    @Override

    public void

onSubscribe(Disposable d) {

    }

    @Override

    public void

onNext(List<Integer> stringList) {

        Log.

d

(

TAG

,

"

缓存区里的事件数量

= "

  • stringList.size());

          for
    

(Integer value : stringList) {

            Log.

d

(

TAG

,

"

事件

= "

  • value);

          }
    
      }
    
      @Override
    
      public void
    

onError(Throwable e) {

        Log.

d

(

TAG

,

""

);

    }

    @Override

    public void

onComplete() {

        Log.

d

(

TAG

,

""

);

    }

});

四. 实际开发需求案例

  • 变换操作符的主要开发需求场景 = 嵌套回调(Callback hell)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转载自:https://xiaobailong24.me/2017/03/18/Android-RxJava2.x...
    Young1657阅读 6,130评论 1 9
  • 怎么如此平静, 感觉像是走错了片场.为什么呢, 因为上下游工作在同一个线程呀骚年们! 这个时候上游每次调用emit...
    Young1657阅读 5,493评论 2 1
  • 作者: maplejaw本篇只解析标准包中的操作符。对于扩展包,由于使用率较低,如有需求,请读者自行查阅文档。 创...
    maplejaw_阅读 46,065评论 8 93
  • 注:只包含标准包中的操作符,用于个人学习及备忘参考博客:http://blog.csdn.net/maplejaw...
    小白要超神阅读 6,693评论 2 8
  • 不羡慕漫天黄沙的蛮横威武 不嫉妒镜湖碧波的深沉高贵 我是来来去去的浮尘 风带我到每个陌生的地方 我从来没有见到过自...
    小小仲马阅读 2,507评论 3 3

友情链接更多精彩内容