RxJava2.0第六篇之其他

本文要將要介紹的操作符,其中 “(xxx)->{}” 爲lambda表達式

一、distinct(去重),filter(條件過濾)

  Observable.just(1, 2, 2, 5, 6, 6, 8, 2, 8, 9)
                .distinct() //去除重複發送的數據
                .filter((integer) -> {   //filter 過濾數據
                    return integer > 5;  //只發送大於5的數據
                })
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(@NonNull Integer integer) throws Exception {
                        Log.e("---->", integer + "===>");
                    }
                });

輸出日誌:

09-23 18:45:13.318 5588-5588/jy.com.rxjava2 E/---->: 6===>
09-23 18:45:13.318 5588-5588/jy.com.rxjava2 E/---->: 8===>
09-23 18:45:13.318 5588-5588/jy.com.rxjava2 E/---->: 9===>

 

二、buffer 緩存

2.1 參數只有一個的時候

// count,緩存的數量
public final Observable<List<T>> buffer(int count) {
        return buffer(count, count);
    }

//示例代碼

Observable.just(1, 2, 3, 4, 5).buffer(3).subscribe(new Consumer<List<Integer>>() {
            @Override
            public void accept(@NonNull List<Integer> integers) throws Exception {
                Log.e("buffer   : ",   integers  + "\n");
            }
        });

//輸出日誌:

09-23 21:15:21.468 19242-19242/jy.com.rxjava2 E/buffer   :: [1, 2, 3]
09-23 21:15:21.468 19242-19242/jy.com.rxjava2 E/buffer   :: [4, 5]

 2.2 buffer 的重載方法,其中的count表示要緩存的數量,skip(跳過、略過)跳過幾個數據,例如下邊的例子,發送數據爲12345,緩存數量爲3個,每次跳過2個數據,所以一次發射的數據爲123,那麼第二次skip跳過2個,則發射數據爲345,第三次跳過2個,則發射5 ;   take 方法是標識消費者最多可以接受幾個,原本前邊可以發射三組數據,現在加入take方法,只能發送兩組數據了

public final Observable<List<T>> buffer(int count, int skip) {
        return buffer(count, skip, ArrayListSupplier.<T>asCallable());
    }

 

//示例代碼
Observable.just(1, 2, 3, 4, 5)
         .buffer(3, 2)
         .take(2)  // 可以試着去除該方法試試,日誌會多處一行日誌
         .subscribe(new Consumer<List<Integer>>() {
            @Override
            public void accept(@NonNull List<Integer> integers) throws Exception {
                Log.e("buffer   : ",   integers  + "\n");
            }
        });


//日誌輸出:

09-23 21:48:13.418 25633-25633/jy.com.rxjava2 E/buffer   :: [1, 2, 3]
09-23 21:48:13.418 25633-25633/jy.com.rxjava2 E/buffer   :: [3, 4, 5]
 

 

三、debounce 爲除去少於固定發射時間的方法; 案例中是去除了少於300毫秒的事件

Observable.create(e -> {
            e.onNext(1);
            Thread.sleep(500);
            e.onNext(2);
            Thread.sleep(100);
            e.onNext(6);
            Thread.sleep(600);
        }).debounce(300, TimeUnit.MILLISECONDS)
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(number -> {
                    Log.e("==debounce====>",number+"");
                });

輸入日誌:

09-23 22:32:43.568 14078-14078/jy.com.rxjava2 E/==debounce====>: 1
09-23 22:32:43.788 14078-14078/jy.com.rxjava2 E/==debounce====>: 6

 

四、scan,對發射事件數據掃描觀察,該方法中是一個BiFunction接口,前兩個輸入類型和輸出類型自定義,我們示例代碼中做了加法運行,當第一次運行的時直接交給了消費者處理,第二次運行纔將apply方法參數都初始化進行運行,以後的再將結果繼續累加處理

上圖可以看出,scan方法是不斷從第一個數據累加上來的,注意下面小球的變化

 

// 元方法
 public final Observable<T> scan(BiFunction<T, T, T> accumulator) {
        ObjectHelper.requireNonNull(accumulator, "accumulator is null");
        return RxJavaPlugins.onAssembly(new ObservableScan<T>(this, accumulator));
    }


//示例代碼
 Observable.just(2, 6, 8, 10).scan(new BiFunction<Integer, Integer, Integer>() {
            @Override
            public Integer apply(@NonNull Integer integer, @NonNull Integer integer2) throws Exception {
                Log.e("==reduce 1====>",integer + "+" + integer2 + "="+"");
                return integer + integer2;
            }
        }).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(@NonNull Integer integer) throws Exception {
                Log.e("==reduce 2====>",integer+"");
            }
        });


//日誌輸出
09-23 22:56:51.588 10428-10428/jy.com.rxjava2 E/==reduce 2====>: 2
09-23 22:56:51.588 10428-10428/jy.com.rxjava2 E/==reduce 1====>: 2+6=
09-23 22:56:51.588 10428-10428/jy.com.rxjava2 E/==reduce 2====>: 8
09-23 22:56:51.598 10428-10428/jy.com.rxjava2 E/==reduce 1====>: 8+8=
09-23 22:56:51.598 10428-10428/jy.com.rxjava2 E/==reduce 2====>: 16
09-23 22:56:51.598 10428-10428/jy.com.rxjava2 E/==reduce 1====>: 16+10=
09-23 22:56:51.598 10428-10428/jy.com.rxjava2 E/==reduce 2====>: 26

 

五、window方法,收集夠三秒後才發射,看着和上面說到的buffer 有點雷同,但是他們的是截然不同的,buffer是用來緩存值的,而window是在規定時間內收集數據的,所以他們都是搞收集工作,但是buffer是緩存數據,爲window是在按時間收集數據的

Observable.interval(1, TimeUnit.SECONDS) // 間隔一秒發一次
          .window(3, TimeUnit.SECONDS)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<Observable<Long>>() {
                    @Override
                    public void accept(@NonNull Observable<Long> longObservable) throws Exception {
                        Log.e(TAG, "Sub Divide begin...\n");
                        longObservable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<Long>() {
                            @Override
                            public void accept(@NonNull Long aLong) throws Exception {
                                Log.e(TAG, "Next:" + aLong + "\n");
                            }
                        });
                    }
       });


日誌:

9-24 15:40:01.798 20151-20151/jy.com.rxjava2 E/ContentValues: Next:0
09-24 15:40:02.448 20151-20151/jy.com.rxjava2 E/ContentValues: Next:1
09-24 15:40:03.418 20151-20151/jy.com.rxjava2 E/ContentValues: Sub Divide begin...
09-24 15:40:03.448 20151-20151/jy.com.rxjava2 E/ContentValues: Next:2
09-24 15:40:04.448 20151-20151/jy.com.rxjava2 E/ContentValues: Next:3
09-24 15:40:05.448 20151-20151/jy.com.rxjava2 E/ContentValues: Next:4
09-24 15:40:06.418 20151-20151/jy.com.rxjava2 E/ContentValues: Sub Divide begin...
09-24 15:40:06.448 20151-20151/jy.com.rxjava2 E/ContentValues: Next:5
09-24 15:40:07.448 20151-20151/jy.com.rxjava2 E/ContentValues: Next:6
09-24 15:40:08.447 20151-20151/jy.com.rxjava2 E/ContentValues: Next:7
09-24 15:40:09.417 20151-20151/jy.com.rxjava2 E/ContentValues: Sub Divide begin...
09-24 15:40:09.447 20151-20151/jy.com.rxjava2 E/ContentValues: Next:8
09-24 15:40:10.447 20151-20151/jy.com.rxjava2 E/ContentValues: Next:9
09-24 15:40:11.447 20151-20151/jy.com.rxjava2 E/ContentValues: Next:10

 

六、forEach

Observable.just(2,3,6,8,9).forEach(new Consumer<Integer>() {
            @Override
            public void accept(@NonNull Integer integer) throws Exception {
                Log.e("===forEach========>",   + integer + " ");
            }
        });



        Observable.just(2,3,6,8,9).doOnEach(new Consumer<Notification<Integer>>() {
            @Override
            public void accept(@NonNull Notification<Integer> integerNotification) throws Exception {
                Log.e("===doOnEach 1========>",   + integerNotification.getValue() + " ");
            }
        }).subscribe();


輸出日誌:

09-24 16:49:46.175 23198-23198/jy.com.rxjava2 E/===forEach========>: 2 
09-24 16:49:46.175 23198-23198/jy.com.rxjava2 E/===forEach========>: 3 
09-24 16:49:46.185 23198-23198/jy.com.rxjava2 E/===forEach========>: 6 
09-24 16:49:46.185 23198-23198/jy.com.rxjava2 E/===forEach========>: 8 
09-24 16:49:46.185 23198-23198/jy.com.rxjava2 E/===forEach========>: 9 
09-24 16:49:46.205 23198-23198/jy.com.rxjava2 E/===doOnEach 1========>: 2 
09-24 16:49:46.205 23198-23198/jy.com.rxjava2 E/===doOnEach 1========>: 3 
09-24 16:49:46.205 23198-23198/jy.com.rxjava2 E/===doOnEach 1========>: 6 
09-24 16:49:46.205 23198-23198/jy.com.rxjava2 E/===doOnEach 1========>: 8 
09-24 16:49:46.215 23198-23198/jy.com.rxjava2 E/===doOnEach 1========>: 9 
09-24 16:49:46.215 23198-23198/jy.com.rxjava2 E/===doOnEach 1========>: null

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章