本文要將要介紹的操作符,其中 “(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