RxJava學(xué)習(xí)(一)Map,FlatMap,ConcatMap,Buffer操作符

1.Map操作符
作用:將被觀察者發(fā)送的事件轉(zhuǎn)換為任意類型的事件
例子:數(shù)據(jù)類型的轉(zhuǎn)換

/**
     * map 操作符
     * 事件轉(zhuǎn)換
     * 將被觀察者發(fā)送的事件轉(zhuǎn)換為任意的類型事件。
     * 例子:數(shù)據(jù)類型轉(zhuǎn)換
     */
    private void map() {
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                e.onNext(111);
            }
            //使用map操作符進(jìn)行事件轉(zhuǎn)換
        }).map(new Function<Integer, String>() {
            @Override
            public String apply(Integer integer) throws Exception {
                return String.valueOf(integer) + "你好";
            }
            //被觀察者訂閱事件
        }).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                Log.e(TAG, "轉(zhuǎn)換結(jié)果: " + s);
            }
        });
    }

輸出結(jié)果:

image.png

2.FlatMap操作符
作用:將被觀察者發(fā)送的多個(gè)事件進(jìn)行拆分,分別轉(zhuǎn)換為不同的事件
,然后合并成新的事件
例子:將每個(gè)Integer數(shù)據(jù)分別轉(zhuǎn)換成一個(gè)List,然后再迭代

/**
     *FlatMap 操作符
     * 將被觀察者的事件順序拆分
     *
     * 單獨(dú)轉(zhuǎn)換
     *  在合并成新的事件
     *
     */
    private void flatMap(){
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                e.onNext(1);
                e.onNext(2);
                e.onNext(3);
                Log.e(TAG, "----- " );

            }
        }).flatMap(new Function<Integer, ObservableSource<String>>() {
            @Override
            public ObservableSource<String> apply(Integer integer) throws Exception {
                List<String> list = new ArrayList<>();
                //分別對(duì)被觀察者的事件進(jìn)行加工轉(zhuǎn)換i
                for (int i = 0; i <2 ; i++) {
                    list.add("我是事件"+integer+"拆分后的子事件為"+i);
                }
                Log.e(TAG, "---------");
                //拆分后合并
                //
                return Observable.fromIterable(list);
            }
        }).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                Log.e(TAG, "accept: "+s );
            }
        });

    }

輸出結(jié)果:


image.png

3.ConcatMap操作符
和FlatMap操作符原理一樣,區(qū)別在于 FlatMap把事件拆分再合并的時(shí)候,順序可能和被觀察者發(fā)送的事件順序不一樣,而ConcatMap操作符處理后的事件順序和被觀察者發(fā)送事件的順序是一樣的。

 /**
     * 類似FlatMap()操作符
     * 但是新事件循序還是和觀察者的順序一樣
     */
    private void concatMap(){
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                e.onNext(1);
                e.onNext(2);
                e.onNext(3);
                e.onNext(4);
                e.onNext(5);
                e.onNext(6);
                Log.e(TAG, "----- " );
            }
        }).concatMap(new Function<Integer, ObservableSource<String>>() {
            @Override
            public ObservableSource<String> apply(Integer integer) throws Exception {
                List<String> list = new ArrayList<>();
                for (int i = 0; i <2 ; i++) {
                    list.add("我是事件"+integer+"拆分后的子事件為"+i);
                }
                Log.e(TAG, "----- " );
                return Observable.fromIterable(list);
            }
        }).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                Log.e(TAG, "accept: "+s );
            }
        });
    }

輸出結(jié)果:


image.png

4.Buffer操作符
把被觀察者的事件進(jìn)行緩存,然后每次從緩存中拿出一定數(shù)量事件發(fā)送給觀察者。

  /**
     * buffer 操作符
     * 定期從 被觀察者(Obervable)需要發(fā)送的事件中
     * 獲取一定數(shù)量的事件 & 放到緩存區(qū)中,最終發(fā)送
     * 緩存被觀察者的發(fā)送事件
     *
     */
    private void buffer(){
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                e.onNext(1);
                e.onNext(2);
                e.onNext(3);
                e.onNext(4);
            }
        }).buffer(2,1)//參數(shù)1:每次發(fā)送給觀察者事件的數(shù)量。參數(shù)2:每次從緩存中取出事件的數(shù)量
        .subscribe(new Consumer<List<Integer>>() {
            @Override
            public void accept(List<Integer> i) throws Exception {
                for (int j = 0; j <i.size() ; j++) {
                    Log.e(TAG, "accept: "+i.get(j) );
                }
            }
        });
    }

輸出結(jié)果


image.png
最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 一、RxJava操作符概述 RxJava中的操作符就是為了提供函數(shù)式的特性,函數(shù)式最大的好處就是使得數(shù)據(jù)處理簡潔易...
    測天測地測空氣閱讀 685評(píng)論 0 1
  • 一、RxJava操作符概述 RxJava中的操作符就是為了提供函數(shù)式的特性,函數(shù)式最大的好處就是使得數(shù)據(jù)處理簡潔易...
    BrotherChen閱讀 1,782評(píng)論 0 10
  • 前言 通過上篇的實(shí)例,相信你對(duì)RxJava的用處肯定有個(gè)基本的了解了。如果還沒看過,我強(qiáng)烈建議你先去看上篇,先對(duì)整...
    luoqiang108閱讀 516評(píng)論 0 3
  • 一、RxJava操作符概述 RxJava中的操作符就是為了提供函數(shù)式的特性,函數(shù)式最大的好處就是使得數(shù)據(jù)處理簡潔易...
    無求_95dd閱讀 3,495評(píng)論 0 21
  • RxJava 博大精深,想要入門和進(jìn)階,操作符是一個(gè)切入點(diǎn)。 所以,我們希望尋找一種可以把操作符寫得比較爽,同時(shí)可...
    geniusmart閱讀 6,643評(píng)論 3 32

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