RxJava——變換操作符

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

一、變換操作符的作用

  1. 對(duì)事件序列中的事件/整個(gè)事件序列進(jìn)行加工處理(

    變換

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

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

二、變換操作符的類型

RxJava中常見(jiàn)的變換操作符有

Map()

    FlatMap()

    ConcatMap()

    Buffer()

三、變換操作符的介紹

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

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

    應(yīng)用場(chǎ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ù)對(duì)被觀察者發(fā)送的事件進(jìn)行統(tǒng)一變換:整型轉(zhuǎn)換為字符型

    @Override

    public String apply(Integer integer) throws Exception{

        return 

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

    }

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

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

    @Override

    public void accept(String s) throws Exception{

        Log.d(TAG,s);

    }

});

2.FlatMap()

作用:

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

原理:

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

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

3.將新建的每個(gè)Observable都合并到一個(gè)新建的、總的Observable對(duì)象

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

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

應(yīng)用場(chǎng)景:

無(wú)序的將被觀察者發(fā)送的整個(gè)事件序列進(jìn)行變換。

具體使用:

//

采用

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)用場(chǎng)景:

    有序的

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

具體使用:

//

采用

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)用場(chǎng)景:

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

具體使用:

//

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

5

個(gè)數(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

,

""

);

    }

});

四. 實(shí)際開(kāi)發(fā)需求案例

  • 變換操作符的主要開(kāi)發(fā)需求場(chǎng)景 = 嵌套回調(diào)(Callback hell)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載自:https://xiaobailong24.me/2017/03/18/Android-RxJava2.x...
    Young1657閱讀 2,104評(píng)論 1 9
  • 怎么如此平靜, 感覺(jué)像是走錯(cuò)了片場(chǎng).為什么呢, 因?yàn)樯舷掠喂ぷ髟谕粋€(gè)線程呀騷年們! 這個(gè)時(shí)候上游每次調(diào)用emit...
    Young1657閱讀 1,672評(píng)論 2 1
  • 作者: maplejaw本篇只解析標(biāo)準(zhǔn)包中的操作符。對(duì)于擴(kuò)展包,由于使用率較低,如有需求,請(qǐng)讀者自行查閱文檔。 創(chuàng)...
    maplejaw_閱讀 46,187評(píng)論 8 93
  • 注:只包含標(biāo)準(zhǔn)包中的操作符,用于個(gè)人學(xué)習(xí)及備忘參考博客:http://blog.csdn.net/maplejaw...
    小白要超神閱讀 2,366評(píng)論 2 8
  • 不羨慕漫天黃沙的蠻橫威武 不嫉妒鏡湖碧波的深沉高貴 我是來(lái)來(lái)去去的浮塵 風(fēng)帶我到每個(gè)陌生的地方 我從來(lái)沒(méi)有見(jiàn)到過(guò)自...
    小小仲馬閱讀 353評(píng)論 3 3

友情鏈接更多精彩內(nèi)容