通过具体的示例,学习每个操作符的用法~
1.CombineLatest
当一个项目由两个Observable中的任何一个发出时,通过指定的函数组合每个Observable发出的最新项目,并根据该函数的结果发出项目。
示例:
Observable.combineLatest(
Observable.interval(1, TimeUnit.SECONDS),
Observable.interval(2, TimeUnit.SECONDS),
object : BiFunction<Long, Long, String> {
override fun apply(t1: Long, t2: Long): String {
return "$t1 $t2"
}
})
.take(10)
.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-11-20 11:05:22.818 E/CombiningOperator: ---------onSubscribe---------
2022-11-20 11:05:24.820 E/CombiningOperator: ---------onNext--------1 0-
2022-11-20 11:05:25.819 E/CombiningOperator: ---------onNext--------2 0-
2022-11-20 11:05:26.819 E/CombiningOperator: ---------onNext--------3 0-
2022-11-20 11:05:26.820 E/CombiningOperator: ---------onNext--------3 1-
2022-11-20 11:05:27.820 E/CombiningOperator: ---------onNext--------4 1-
2022-11-20 11:05:28.819 E/CombiningOperator: ---------onNext--------5 1-
2022-11-20 11:05:28.819 E/CombiningOperator: ---------onNext--------5 2-
2022-11-20 11:05:29.819 E/CombiningOperator: ---------onNext--------6 2-
2022-11-20 11:05:30.819 E/CombiningOperator: ---------onNext--------7 2-
2022-11-20 11:05:30.819 E/CombiningOperator: ---------onNext--------7 3-
2022-11-20 11:05:30.820 E/CombiningOperator: ---------onComplete---------
2.Join
Join操作符根据另一个可观察器发射的项目定义的时间段内,每当一个可观测器发射的一个项目发射时,组合两个可观察器发射的项。
示例:
//other-第二个要从中联接项的ObservableSource
//leftEnd-一个函数,用于为当前Observable发出的每个项目选择持续时间,用于确定重叠
//rightEnd—为右ObservableSource发出的每个项目选择持续时间的函数,用于确定重叠
//resultSelector—一个函数,用于计算由两个ObservableSource发出的任何两个重叠项目的结果Observalble发出的项目
Observable.interval(1000, TimeUnit.MILLISECONDS)
.take(5)
.join(
Observable.just("A"),
object : Function<Long, ObservableSource<Long>> {
override fun apply(t: Long): ObservableSource<Long> {
return Observable.timer(1000, TimeUnit.MILLISECONDS)
}
},
object : Function<String, ObservableSource<Long>> {
override fun apply(t: String): ObservableSource<Long> {
return Observable.timer(3000, TimeUnit.MILLISECONDS)
}
},
object : BiFunction<Long, String, String> {
override fun apply(t1: Long, t2: String): String {
return "$t1 ------- $t2"
}
})
.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---------")
}
})
输出结果:
//第一个Observalble发送了5个数据,第二个Observalble只发送了一个数据。第二个Observalble的持续时间为3秒,所以只匹配到了3组数据,但是onComplete还是在5秒后才被调用。
2022-11-20 11:40:20.528 E/CombiningOperator: ---------onSubscribe---------
2022-11-20 11:40:21.530 E/CombiningOperator: ---------onNext--------0 ------- A-
2022-11-20 11:40:22.532 E/CombiningOperator: ---------onNext--------1 ------- A-
2022-11-20 11:40:23.532 E/CombiningOperator: ---------onNext--------2 ------- A-
2022-11-20 11:40:25.532 E/CombiningOperator: ---------onComplete---------
3.Merge⭐️⭐️
将多个Observable合并成一个Observable。
- 每个Observable发送的数据是穿插且无序的,完全取决于事件发送的早或晚。如果对顺序有要求可以参考Concat操作符。
- 当某一个Observable出现异常,执行了OnError后,那么所有的事件发送都会终止。如果希望其他Observable不受OnError影响的话,可以参考MergeDelayError操作符。
示例:
Observable.merge(
Observable.interval(3, TimeUnit.SECONDS)
.flatMap {
Observable.just("第一个 $it")
}.take(5),
Observable.interval(1, TimeUnit.SECONDS)
.flatMap {
Observable.just("第二个 $it")
}.take(5)
).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-11-20 11:48:34.329 E/CombiningOperator: ---------onSubscribe---------
2022-11-20 11:48:35.332 E/CombiningOperator: ---------onNext--------第二个 0-
2022-11-20 11:48:36.332 E/CombiningOperator: ---------onNext--------第二个 1-
2022-11-20 11:48:37.331 E/CombiningOperator: ---------onNext--------第一个 0-
2022-11-20 11:48:37.331 E/CombiningOperator: ---------onNext--------第二个 2-
2022-11-20 11:48:38.332 E/CombiningOperator: ---------onNext--------第二个 3-
2022-11-20 11:48:39.332 E/CombiningOperator: ---------onNext--------第二个 4-
2022-11-20 11:48:40.331 E/CombiningOperator: ---------onNext--------第一个 1-
2022-11-20 11:48:43.331 E/CombiningOperator: ---------onNext--------第一个 2-
2022-11-20 11:48:46.331 E/CombiningOperator: ---------onNext--------第一个 3-
2022-11-20 11:48:49.330 E/CombiningOperator: ---------onNext--------第一个 4-
2022-11-20 11:48:49.331 E/CombiningOperator: ---------onComplete---------
4.StartWith⭐️
在开始从源Observable发出项目之前发出指定的项目序列。
示例:
Observable.just(2,3)
.startWith(Observable.just(1))
.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---------")
}
})
输出结果:
2022-11-20 12:06:03.816 E/CombiningOperator: ---------onSubscribe---------
2022-11-20 12:06:03.816 E/CombiningOperator: ---------onNext--------1-
2022-11-20 12:06:03.816 E/CombiningOperator: ---------onNext--------2-
2022-11-20 12:06:03.816 E/CombiningOperator: ---------onNext--------3-
2022-11-20 12:06:03.816 E/CombiningOperator: ---------onComplete---------
5.Switch
Switch操作符可以理解为用来切换观察者,切换后开始发送新的Observable的事件,原来的Observable事件将被舍弃。
示例:
Observable.empty<Int>()
.switchIfEmpty(Observable.just(1, 2, 3))
.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---------")
}
})
输出结果:
2022-11-20 12:07:14.039 E/CombiningOperator: ---------onSubscribe---------
2022-11-20 12:07:14.039 E/CombiningOperator: ---------onNext--------1-
2022-11-20 12:07:14.039 E/CombiningOperator: ---------onNext--------2-
2022-11-20 12:07:14.040 E/CombiningOperator: ---------onNext--------3-
2022-11-20 12:07:14.040 E/CombiningOperator: ---------onComplete---------
示例2:
Observable.just(1)
.switchMapMaybe(object : Function<Int, MaybeSource<Int>> {
override fun apply(t: Int): MaybeSource<Int> {
return MaybeJust.just(2)
}
})
.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---------")
}
})
输出结果:
2022-11-20 12:07:14.058 E/CombiningOperator: ---------onSubscribe---------
2022-11-20 12:07:14.059 E/CombiningOperator: ---------onNext--------2-
2022-11-20 12:07:14.059 E/CombiningOperator: ---------onComplete---------
6.Zip⭐️⭐️
Zip操作符定义函数将多个Observable的发射事项组合在一起,并将该函数的返回结果作为一个组合事项发送。事项组合是一一对应的,没有匹配的事项会被舍弃。
示例:
val take1 = Observable.interval(3, TimeUnit.SECONDS)
.flatMap {
Observable.just("第一个 $it")
}.take(5)
val take2 = Observable.interval(1, TimeUnit.SECONDS)
.flatMap {
Observable.just("第二个 $it")
}.take(5)
Observable.zip(take1, take2, object : BiFunction<String, String, String> {
override fun apply(t1: String, t2: String): String {
return "$t1-----------$t2"
}
}).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-11-20 12:20:17.012 E/CombiningOperator: ---------onSubscribe---------
2022-11-20 12:20:20.015 E/CombiningOperator: -------onNext--------第一个 0-------第二个 0-
2022-11-20 12:20:23.014 E/CombiningOperator: -------onNext--------第一个 1-------第二个 1-
2022-11-20 12:20:26.014 E/CombiningOperator: -------onNext--------第一个 2-------第二个 2-
2022-11-20 12:20:29.014 E/CombiningOperator: -------onNext--------第一个 3-------第二个 3-
2022-11-20 12:20:32.014 E/CombiningOperator: -------onNext--------第一个 4-------第二个 4-
2022-11-20 12:20:32.015 E/CombiningOperator: ---------onComplete---------