通过具体的示例,学习每个操作符的用法~
1.Buffer ⭐️
Buffer操作符将发出项目的Observable转换为发出这些项目的缓冲集合的Observable。也就是根据buffer的大小缓冲发出的项目,达到缓冲大小时再发出项目集合。其中onError事件不会进入缓冲区,原Observable一旦发出onError,那么buffer会立即传递此通知。
示例:
Observable.interval(100, TimeUnit.MILLISECONDS)
.take(10)
.buffer(5)
.subscribe(object : Observer<List<Long>> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onNext(t: List<Long>) {
Log.e(TAG, "---------onNext--------${t}-")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
override fun onComplete() {
Log.e(TAG, "---------onComplete---------")
}
})
输出结果:
2022-10-11 22:42:31.000 E/TransformingOperator: ---------onSubscribe---------
2022-10-11 22:42:31.502 E/TransformingOperator: ---------onNext--------[0, 1, 2, 3, 4]-
2022-10-11 22:42:32.003 E/TransformingOperator: ---------onNext--------[5, 6, 7, 8, 9]-
2022-10-11 22:42:32.003 E/TransformingOperator: ---------onComplete---------
2.FlatMap ⭐️
将源Observable发出的每个项目转换为新的Observable,并将新的Observable的发射结果合并结果作为自己的序列发射。其中新生成的Observable发射的项目是可以交错的。如果想要严格按照顺序发射,那么可以使用ConcatMap。
示例:
Observable.interval(100, TimeUnit.MILLISECONDS)
.take(10)
.flatMap(object : Function<Long, ObservableSource<String>> {
override fun apply(t: Long): Observable<String> {
return Observable.just("flatMap ------${t}")
}
})
.subscribe(object : Observer<String> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onNext(t: String) {
Log.e(TAG, "---------onNext--------${t}-")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
override fun onComplete() {
Log.e(TAG, "---------onComplete---------")
}
})
输出结果:
2022-10-11 22:48:05.264 E/TransformingOperator: ---------onSubscribe---------
2022-10-11 22:48:05.366 E/TransformingOperator: ---------onNext--------flatMap ------0-
2022-10-11 22:48:05.466 E/TransformingOperator: ---------onNext--------flatMap ------1-
2022-10-11 22:48:05.566 E/TransformingOperator: ---------onNext--------flatMap ------2-
2022-10-11 22:48:05.567 E/TransformingOperator: ---------onComplete---------
3.GroupBy
把原来的一个Observable拆分成多个Observable,并将生成的Observable作为事项进行发送。
每个组的事项各自发送,事项之间存在交错发送。
示例:
Observable.just(1,2,3,4,5,6)
.groupBy(object : Function<Int, String> {
override fun apply(t: Int): String {
return if (t % 2 == 0) {
"偶数"
} else {
"奇数"
}
}
})
.subscribe(object : Observer<GroupedObservable<String, Int>> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "----GroupedObservable-----onSubscribe---------")
}
override fun onNext(observable:GroupedObservable<String, Int>) {
Log.e(TAG, "----GroupedObservable-----onNext---------")
observable.subscribe(object:Observer<Int>{
override fun onSubscribe(d: Disposable) {
Log.d(TAG, "----Observer-----onSubscribe---------")
}
override fun onNext(t: Int) {
Log.d(TAG, " ----Observer-----onNext---------组:" + observable.getKey() + " 值:" + t);
}
override fun onError(e: Throwable) {
Log.d(TAG, "----Observer-----onError---------")
}
override fun onComplete() {
Log.d(TAG, "----Observer-----onComplete---------")
}
})
}
override fun onError(e: Throwable) {
Log.e(TAG, "----GroupedObservable-----onError---------")
}
override fun onComplete() {
Log.e(TAG, "----GroupedObservable-----onComplete---------")
}
})
输出结果:
E/TransformingOperator: ----GroupedObservable-----onSubscribe---------
E/TransformingOperator: ----GroupedObservable-----onNext---------
D/TransformingOperator: ----Observer-----onSubscribe---------
D/TransformingOperator: ----Observer-----onNext---------组:奇数 值:1
E/TransformingOperator: ----GroupedObservable-----onNext---------
D/TransformingOperator: ----Observer-----onSubscribe---------
D/TransformingOperator: ----Observer-----onNext---------组:偶数 值:2
D/TransformingOperator: ----Observer-----onNext---------组:奇数 值:3
D/TransformingOperator: ----Observer-----onNext---------组:偶数 值:4
D/TransformingOperator: ----Observer-----onNext---------组:奇数 值:5
D/TransformingOperator: ----Observer-----onNext---------组:偶数 值:6
D/TransformingOperator: ----Observer-----onComplete---------
D/TransformingOperator: ----Observer-----onComplete---------
E/TransformingOperator: ----GroupedObservable-----onComplete---------
4. Map ⭐️
对源Observable发出的每个项进行转换操作后,再发出。
示例:
Observable.range(1,5)
.map(object:Function<Int,String>{
override fun apply(t: Int): String {
return "-- map >> -------${t}-----------"
}
})
.subscribe(object : Observer<String> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onNext(t: String) {
Log.e(TAG, "---------onNext--------${t}-")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
override fun onComplete() {
Log.e(TAG, "---------onComplete---------")
}
})
输出结果:
E/TransformingOperator: ---------onSubscribe---------
E/TransformingOperator: ---------onNext---------- map >> -------1------------
E/TransformingOperator: ---------onNext---------- map >> -------2------------
E/TransformingOperator: ---------onNext---------- map >> -------3------------
E/TransformingOperator: ---------onNext---------- map >> -------4------------
E/TransformingOperator: ---------onNext---------- map >> -------5------------
E/TransformingOperator: ---------onComplete---------
5.Scan
将当前的事项和前一次结果进行运算后的新结果作为事项发出,有时称scan运算符为“累加器”。
示例:
Observable.range(1,5)
.scan(object:BiFunction<Int,Int,Int>{
// t1 上次的结果,t2 本次的值,返回t1和t2的运算结果
override fun apply(t1: Int, t2: Int): Int {
Log.e(TAG, "---------apply--------${t1}----${t2}----")
return t1+t2
}
})
.subscribe(object : Observer<Int> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onNext(t: Int) {
Log.e(TAG, "---------onNext--------${t}-")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
override fun onComplete() {
Log.e(TAG, "---------onComplete---------")
}
})
输出结果:
E/TransformingOperator: ---------onSubscribe---------
E/TransformingOperator: ---------onNext--------1-
E/TransformingOperator: ---------apply--------1----2----
E/TransformingOperator: ---------onNext--------3-
E/TransformingOperator: ---------apply--------3----3----
E/TransformingOperator: ---------onNext--------6-
E/TransformingOperator: ---------apply--------6----4----
E/TransformingOperator: ---------onNext--------10-
E/TransformingOperator: ---------apply--------10----5----
E/TransformingOperator: ---------onNext--------15-
E/TransformingOperator: ---------onComplete---------
6.Window
Window类似于Buffer,但它不是从源Observable发出项目数据包,而是发出Observables,每个Observable都从源Observable发送一个子集项目,然后以onCompleted通知终止。
前一个窗口关闭后,新的窗口才会打开,也就是子集项目不会交错。
示例:
Observable.range(1,6)
.window(3)
.subscribe(object : Observer<Observable<Int>> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---window-----onSubscribe---------")
}
override fun onNext(observable: Observable<Int>) {
Log.e(TAG, "---window-----onNext--------")
observable.subscribe(object:Observer<Int>{
override fun onSubscribe(d: Disposable) {
Log.d(TAG, "----Observer-----onSubscribe---------")
}
override fun onNext(t: Int) {
Log.d(TAG, " ----Observer-----onNext--------$t-");
}
override fun onError(e: Throwable) {
Log.d(TAG, "----Observer-----onError---------")
}
override fun onComplete() {
Log.d(TAG, "----Observer-----onComplete---------")
}
})
}
override fun onError(e: Throwable) {
Log.e(TAG, "---window------onError---------")
}
override fun onComplete() {
Log.e(TAG, "---window------onComplete---------")
}
})
输出结果:
E/TransformingOperator: ---window------onSubscribe---------
E/TransformingOperator: ---window------onNext--------
D/TransformingOperator: ----Observer-----onSubscribe---------
D/TransformingOperator: ----Observer-----onNext--------1-
D/TransformingOperator: ----Observer-----onNext--------2-
D/TransformingOperator: ----Observer-----onNext--------3-
D/TransformingOperator: ----Observer-----onComplete---------
E/TransformingOperator: ---window------onNext--------
D/TransformingOperator: ----Observer-----onSubscribe---------
D/TransformingOperator: ----Observer-----onNext--------4-
D/TransformingOperator: ----Observer-----onNext--------5-
D/TransformingOperator: ----Observer-----onNext--------6-
D/TransformingOperator: ----Observer-----onComplete---------
E/TransformingOperator: ---window------onComplete---------