rxjava2變換運算符
GroupBy
將一個Observable分拆爲一些Observables集合,它們中的每一個發射原始Observable的一個子序列,GroupBy操作符將原始Observable分拆爲一些Observables集合,它們中的每一個發射原始Observable數據序列的一個子序列。哪個數據項由哪一個Observable發射是由一個函數判定的,這個函數給每一項指定一個Key,Key相同的數據會被同一個Observable發射。
groupBy顧名思義是以xxx分組,groupBy的Function中,自定義分組邏輯將每個信息分配到對應的組,並將組的key標誌返回。GroupedObservable就可以根據key來篩選獲得對應組的元素。
舉個例子:
private void doSomeWork() {
Observable.range(0, 10)
.groupBy(new Function<Integer, String>() {
@Override
public String apply(Integer integer) throws Exception {
return integer % 2 == 0 ? "分組key1" : "分組key2";
}
}).subscribe(new Consumer<GroupedObservable<String, Integer>>() {
@Override
public void accept(final GroupedObservable<String, Integer> stringIntegerGroupedObservable) throws Exception {
Log.d(TAG, " accept : key : " + stringIntegerGroupedObservable.getKey());
if (stringIntegerGroupedObservable.getKey().equalsIgnoreCase("分組key1"))
stringIntegerGroupedObservable.subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
Log.d(TAG, " accept : key : " + stringIntegerGroupedObservable.getKey() + ",value : " + integer);
}
});
}
});
}
將奇數、偶數分組,偶數分組設置個key,key可以自定義,這裏就叫分組key1;奇數分組key叫分組key2。
打印結果
accept : key : 分組key1
accept : key : 分組key1,value : 0
accept : key : 分組key2
accept : key : 分組key1,value : 2
accept : key : 分組key1,value : 4
accept : key : 分組key1,value : 6
accept : key : 分組key1,value : 8
Scan
按順序發出每個連續的值,將該函數的結果作爲其自己的第一個發射。然後 將函數的結果與源Observable發出的第二個項一起反饋到函數中,生成其第二個發射, 依此類推。
Scan掃描,它會順序的發射元素,通過scan函數裏面自定義的操作後,將自定義操作後的值作爲第一個元素傳到下次scan函數中。在某些情況下,這種運算符有時被稱爲“累加器”。所以我們舉個累加的例子:
private void doSomeWork() {
Observable.range(0, 5)
.scan(new BiFunction<Integer, Integer, Integer>() {
@Override
public Integer apply(Integer integer, Integer integer2) throws Exception {
Log.d(TAG, " accept : integer : " + integer + ",integer2 : " + integer2);
return integer + integer2;
}
}).subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
Log.d(TAG, " accept : integer : " + integer);
}
});
}
打印結果
accept : integer : 0
accept : integer : 0,integer2 : 1
accept : integer : 1
accept : integer : 1,integer2 : 2
accept : integer : 3
accept : integer : 3,integer2 : 3
accept : integer : 6
accept : integer : 6,integer2 : 4
accept : integer : 10
通過打印的結果我們可以看到,scan發射元素是順序執行的,並且會將函數的執行結果作爲下一次函數的第一個參數。
Window
定期將Observable中的項目細分爲Observable窗口併發出這些窗口,而不是一次發出一個項目。
Window類似於Buffer,但它不是從源Observable發出項目包,而是發出Observable,每個Observable都從源Observable發出一個項子集,然後用onCompleted通知終止。
舉個例子,每三秒將緩衝的數據發射出來:
private void doSomeWork() {
Observable.interval(1, TimeUnit.SECONDS).take(10)
.window(3, TimeUnit.SECONDS)
.subscribe(new Consumer<Observable<Long>>() {
@Override
public void accept(Observable<Long> longObservable) throws Exception {
Log.d(TAG, "Sub Divide begin....");
longObservable.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
Log.d(TAG, " accept : aLong : " + aLong);
}
});
}
});
}
Sub Divide begin....
accept : aLong : 0
accept : aLong : 1
accept : aLong : 2
Sub Divide begin....
accept : aLong : 3
accept : aLong : 4
Sub Divide begin....
accept : aLong : 5
accept : aLong : 6
accept : aLong : 7
Sub Divide begin....
accept : aLong : 8
accept : aLong : 9
參考資料,參考但不侷限以下鏈接
http://reactivex.io/documentation/operators.html#transforming