通过具体的示例,学习每个操作符的用法~
1.All
确定Observable发射的所有项目是否符合某些标准
示例:
Observable.just(1, 2, 3)
.all(object : Predicate<Int> {
override fun test(t: Int): Boolean {
return t < 3
}
})
.subscribe(object : SingleObserver<Boolean> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
override fun onSuccess(t: Boolean) {
Log.e(TAG, "---------onSuccess--------${t}-")
}
})
输出结果:
2023-01-11 09:43:38.677 E/ConditionalOperator: ---------onSubscribe---------
2023-01-11 09:43:38.677 E/ConditionalOperator: ---------onSuccess--------false-
2.Amb
在给定两个或多个源Observable,哪个Observable发出第一个项目,那么就仅发送这个Observable的所有项目,其他Observable的所有发送事项都将被舍弃。
示例:
Observable.amb(
mutableListOf(
Observable.just(1,3,5).delay(2000, TimeUnit.MILLISECONDS),
Observable.just(2,4,6).delay(1000, TimeUnit.MILLISECONDS)
)
).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---------")
}
})
输出结果:
看输出结果,只输出了第二个Observable的事项,而且是onSubscribe之后延迟了1秒,开始发送事项的。
2023-01-11 09:51:05.663 E/ConditionalOperator: ---------onSubscribe---------
2023-01-11 09:51:06.665 E/ConditionalOperator: ---------onNext-----2----
2023-01-11 09:51:06.665 E/ConditionalOperator: ---------onNext-----4----
2023-01-11 09:51:06.665 E/ConditionalOperator: ---------onNext-----6----
2023-01-11 09:51:06.665 E/ConditionalOperator: ---------onComplete---------
3.Contains
判断Observable发出的项目中是否包含特定项目。
示例:
Observable.just(1, 2, 3)
.contains(2)
.subscribe(object : SingleObserver<Boolean> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
override fun onSuccess(t: Boolean) {
Log.e(TAG, "---------onSuccess--------${t}-")
}
})
输出结果:
2023-01-11 09:56:16.411 E/ConditionalOperator: ---------onSubscribe---------
2023-01-11 09:56:16.411 E/ConditionalOperator: ---------onSuccess--------true-
4.DefaultIfEmpty
如果源Observble不发出任何项目,则发出默认项目。
示例:
Observable.empty<Int>()
.defaultIfEmpty(100)
.subscribe(object : Observer<Int> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
override fun onNext(t: Int) {
Log.e(TAG, "---------onNext------$t---")
}
override fun onComplete() {
Log.e(TAG, "---------onComplete---------")
}
})
输出结果:
2023-01-11 09:59:53.209 E/ConditionalOperator: ---------onSubscribe---------
2023-01-11 09:59:53.210 E/ConditionalOperator: ---------onNext------100---
2023-01-11 09:59:53.210 E/ConditionalOperator: ---------onComplete---------
5.SequenceEqual
判断两个Observable是否发出相同的项目序列。
示例:
Observable.sequenceEqual(
Observable.just(1, 2, 3,4),
Observable.just(1, 2, 3).delay(1000, TimeUnit.MILLISECONDS)
).subscribe(object : SingleObserver<Boolean> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onSuccess(t: Boolean) {
Log.e(TAG, "---------onSuccess-------$t--")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
})
输出结果:
2023-01-11 10:12:28.261 E/ConditionalOperator: ---------onSubscribe---------
2023-01-11 10:12:29.263 E/ConditionalOperator: ---------onSuccess-------false--
6.SkipUntil
SkipUntil操作符订阅源Observable,但忽略其发射,直到第二个Observable发射项目,此时SkipUnil开始镜像源Observable的发射。
示例:
Observable.interval(1, TimeUnit.SECONDS)
.take(5)
.skipUntil(Observable.just(100,200).delay(3, TimeUnit.SECONDS))
.subscribe(object : Observer<Long> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
override fun onNext(t: Long) {
Log.e(TAG, "---------onNext------$t---")
}
override fun onComplete() {
Log.e(TAG, "---------onComplete---------")
}
})
输出结果:
第二个Observable延迟3秒发送事件,所以第一个Observable前3秒的事件被舍弃了。
2023-01-11 10:16:28.744 E/ConditionalOperator: ---------onSubscribe---------
2023-01-11 10:16:31.747 E/ConditionalOperator: ---------onNext------2---
2023-01-11 10:16:32.748 E/ConditionalOperator: ---------onNext------3---
2023-01-11 10:16:33.748 E/ConditionalOperator: ---------onNext------4---
2023-01-11 10:16:33.748 E/ConditionalOperator: ---------onComplete---------
7.SkipWhile
SkipWhile操作符使订阅源Observable之后忽略其发射,直到您指定的条件变为false,此时SkipWhile开始发射源Observable的事件。
示例:
Observable.interval(1, TimeUnit.SECONDS)
.take(5)
.skipWhile(object :Predicate<Long>{
override fun test(t: Long): Boolean {
return t<2
}
})
.subscribe(object : Observer<Long> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
override fun onNext(t: Long) {
Log.e(TAG, "---------onNext------$t---")
}
override fun onComplete() {
Log.e(TAG, "---------onComplete---------")
}
})
输出结果:
2023-01-11 10:33:35.965 E/ConditionalOperator: ---------onSubscribe---------
2023-01-11 10:33:38.966 E/ConditionalOperator: ---------onNext------2---
2023-01-11 10:33:39.966 E/ConditionalOperator: ---------onNext------3---
2023-01-11 10:33:40.967 E/ConditionalOperator: ---------onNext------4---
2023-01-11 10:33:40.967 E/ConditionalOperator: ---------onComplete---------
8.TakeUntil
TakeUntil订阅并开始源Observable,它还监视您提供的第二个Observable,在第二个Observable发出项目或终止后,丢弃由源Observable发射的任何项目。
示例:
Observable.interval(1, TimeUnit.SECONDS)
.takeUntil(Observable.just(100).delay(5, TimeUnit.SECONDS))
.subscribe(object : Observer<Long> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
override fun onNext(t: Long) {
Log.e(TAG, "---------onNext------$t---")
}
override fun onComplete() {
Log.e(TAG, "---------onComplete---------")
}
})
输出结果:
2023-01-11 10:41:00.330 E/ConditionalOperator: ---------onSubscribe---------
2023-01-11 10:41:01.333 E/ConditionalOperator: ---------onNext------0---
2023-01-11 10:41:02.333 E/ConditionalOperator: ---------onNext------1---
2023-01-11 10:41:03.334 E/ConditionalOperator: ---------onNext------2---
2023-01-11 10:41:04.333 E/ConditionalOperator: ---------onNext------3---
2023-01-11 10:41:05.333 E/ConditionalOperator: ---------onComplete---------
9.TakeWhile
订阅Observable之后开始发送事件,当您指定的条件变为false时,TakeWhile操作符将停止Observable发送事件并终止。
示例:
Observable.interval(1, TimeUnit.SECONDS)
.takeWhile(object :Predicate<Long>{
override fun test(t: Long): Boolean {
return t<3
}
})
.subscribe(object : Observer<Long> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
override fun onNext(t: Long) {
Log.e(TAG, "---------onNext------$t---")
}
override fun onComplete() {
Log.e(TAG, "---------onComplete---------")
}
})
输出结果:
2023-01-11 10:48:25.037 E/ConditionalOperator: ---------onSubscribe---------
2023-01-11 10:48:26.039 E/ConditionalOperator: ---------onNext------0---
2023-01-11 10:48:27.039 E/ConditionalOperator: ---------onNext------1---
2023-01-11 10:48:28.039 E/ConditionalOperator: ---------onNext------2---
2023-01-11 10:48:29.039 E/ConditionalOperator: ---------onComplete---------