RxJava——變換操作符

今天,對RxJava中的變換操作符進行學(xué)習(xí)。

一、變換操作符的作用

  1. 對事件序列中的事件/整個事件序列進行加工處理(

    變換

    ),使其轉(zhuǎn)變成不同的事件/整個事件序列

  2. 具體原理如下:
    [圖片上傳失敗...(image-d3d9ac-1512547008288)]

二、變換操作符的類型

RxJava中常見的變換操作符有

Map()

    FlatMap()

    ConcatMap()

    Buffer()

三、變換操作符的介紹

  1. Map()
    作用:對被觀察者發(fā)送的每一個事件都通過制定的函數(shù)處理,從而變成另外一種事件。

[圖片上傳失敗...(image-bc5634-1512547008289)]

    應(yīng)用場景:數(shù)據(jù)類型轉(zhuǎn)換

    具體使用:

以將事件的參數(shù)從整型轉(zhuǎn)換成字符串類型為例

//采用RxJava基于事件流的鏈?zhǔn)讲僮?/p>

Observable.create(new ObservableOnSubscribe<Integer>){

    //1.被觀察者發(fā)送事件 = 參數(shù)為整型 = 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()函數(shù)對被觀察者發(fā)送的事件進行統(tǒng)一變換:整型轉(zhuǎn)換為字符型

    @Override

    public String apply(Integer integer) throws Exception{

        return 

"使用 Map變換操作符 將事件" + integer +"的參數(shù)從 整型"+integer + " 變換成 字符串類型" + integer ;

    }

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

    //3.觀察者接收事件時,是接收到變換后的事件 = 字符串類型

    @Override

    public void accept(String s) throws Exception{

        Log.d(TAG,s);

    }

});

2.FlatMap()

作用:

    將被觀察者發(fā)送的事件序列進行拆分&單獨轉(zhuǎn)換,再合并成一個新的        事件序列,最后再進行發(fā)送。

原理:

1.為事件序列中的每個事件都創(chuàng)建一個Observable對象

2.將對每個原始事件轉(zhuǎn)換后的新事件都放入到對應(yīng)的Observable對象

3.將新建的每個Observable都合并到一個新建的、總的Observable對象

4.新建的、總的Observable對象將新合并的事件序列發(fā)送給Observer

[圖片上傳失敗...(image-68f1ab-1512547008289)]

應(yīng)用場景:

無序的將被觀察者發(fā)送的整個事件序列進行變換。

具體使用:

//

采用

RxJava

基于事件流的鏈?zhǔn)讲僮?/p>

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()的 區(qū)別在于:拆分 & 重新合并生成的事件序列 的順序 = 被觀察者舊序列生產(chǎn)的順序

原理:

[圖片上傳失敗...(image-8bcd75-1512547008289)]

應(yīng)用場景:

    有序的

將被觀察者發(fā)送的整個事件序列進行變換

具體使用:

//

采用

RxJava

基于事件流的鏈?zhǔn)讲僮?/p>

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()

作用:

定期從被觀察者需要發(fā)送的事件中獲取一定數(shù)量的事件放入緩存區(qū)中,最終發(fā)送。

原理:

[圖片上傳失敗...(image-5bf8d4-1512547008289)]

應(yīng)用場景:

    緩存被觀察者發(fā)送的事件

具體使用:

//

被觀察者需要發(fā)送

5

個數(shù)字

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

,

"

緩存區(qū)里的事件數(shù)量

= "

  • 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

,

""

);

    }

});

四. 實際開發(fā)需求案例

  • 變換操作符的主要開發(fā)需求場景 = 嵌套回調(diào)(Callback hell)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載自:https://xiaobailong24.me/2017/03/18/Android-RxJava2.x...
    Young1657閱讀 2,033評論 1 9
  • 怎么如此平靜, 感覺像是走錯了片場.為什么呢, 因為上下游工作在同一個線程呀騷年們! 這個時候上游每次調(diào)用emit...
    Young1657閱讀 1,509評論 2 1
  • 作者: maplejaw本篇只解析標(biāo)準(zhǔn)包中的操作符。對于擴展包,由于使用率較低,如有需求,請讀者自行查閱文檔。 創(chuàng)...
    maplejaw_閱讀 45,788評論 8 93
  • 注:只包含標(biāo)準(zhǔn)包中的操作符,用于個人學(xué)習(xí)及備忘參考博客:http://blog.csdn.net/maplejaw...
    小白要超神閱讀 2,230評論 2 8
  • 不羨慕漫天黃沙的蠻橫威武 不嫉妒鏡湖碧波的深沉高貴 我是來來去去的浮塵 風(fēng)帶我到每個陌生的地方 我從來沒有見到過自...
    小小仲馬閱讀 307評論 3 3