通过具体的示例,学习每个操作符的用法~
1.Debounce
Debounce操作符可以防止频繁发送数据,仅当特定时间间隔已过而未发射另一个项目时,才会从Observable发射项目。
示例:
Observable.interval(3, TimeUnit.SECONDS)
//仅当特定时间间隔已过而未发射另一个项目时,才会从Observable发射项目
//此处如果debounce设置的时间比interval的间隔大的话,就不会发送任何事件
.debounce(2, TimeUnit.SECONDS)
.subscribe(object : Observer<Long> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onNext(t: Long) {
Log.e(TAG, "---------onNext--------${t}-")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
override fun onComplete() {
Log.e(TAG, "---------onComplete---------")
}
})
输出结果:
//interval设置间隔3秒发送一次数据,大于debounce设置的2秒,所以数据正常发送。如果debounce设置的时间比interval的间隔大的话,就不会发送任何事件。
2022-11-19 20:51:31.551 E/FilterOperator: ---------onSubscribe---------
2022-11-19 20:51:36.556 E/FilterOperator: ---------onNext--------0-
2022-11-19 20:51:39.554 E/FilterOperator: ---------onNext--------1-
2022-11-19 20:51:42.554 E/FilterOperator: ---------onNext--------2-
2.Distinct ⭐️
Distinct运算符通过仅允许尚未发出的项目通过来过滤Observable,也就是可以去重。
示例:
Observable.just(1, 2, 2, 3, 4, 4, 5)
.distinct()
.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-19 20:57:48.863 E/FilterOperator: ---------onSubscribe---------
2022-11-19 20:57:48.863 E/FilterOperator: ---------onNext--------1-
2022-11-19 20:57:48.863 E/FilterOperator: ---------onNext--------2-
2022-11-19 20:57:48.863 E/FilterOperator: ---------onNext--------3-
2022-11-19 20:57:48.863 E/FilterOperator: ---------onNext--------4-
2022-11-19 20:57:48.863 E/FilterOperator: ---------onNext--------5-
2022-11-19 20:57:48.863 E/FilterOperator: ---------onComplete---------
3.DistinctUntilChanged
DistinctUntilChanged运算符也是用来去重的操作符,阻止连续重复事件的发送。
示例:
Observable.just(1, 2, 3, 3, 2, 1)
.distinctUntilChanged()
.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-19 20:57:48.864 E/FilterOperator: ---------onSubscribe---------
2022-11-19 20:57:48.864 E/FilterOperator: ---------onNext--------1-
2022-11-19 20:57:48.864 E/FilterOperator: ---------onNext--------2-
2022-11-19 20:57:48.864 E/FilterOperator: ---------onNext--------3-
2022-11-19 20:57:48.864 E/FilterOperator: ---------onNext--------2-
2022-11-19 20:57:48.864 E/FilterOperator: ---------onNext--------1-
2022-11-19 20:57:48.865 E/FilterOperator: ---------onComplete---------
4.ElementAt
ElementAt运算符在源Observable发射的项目序列中提取位于指定索引位置的项目,并将该项目作为其唯一发射,其中索引位置从0开始。
示例:
Observable.just(1, 2, 3, 4, 5)
// index 从0开始
.elementAt(3)
.subscribe(object : MaybeObserver<Int> {
override fun onSuccess(t: Int) {
//找到值走onSuccess
Log.e(TAG, "---------onSuccess--------${t}-")
}
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
override fun onComplete() {
//找不到值走onComplete
Log.e(TAG, "---------onComplete---------")
}
})
输出结果:
//此处如果指定索引的值存在,则会走到onSuccess并获得发射的值;如果索引对应的值不存在,则会走到onComplete。
2022-11-19 21:26:33.115 E/FilterOperator: ---------onSubscribe---------
2022-11-19 21:26:33.115 E/FilterOperator: ---------onSuccess--------4-
示例2:
Observable.just(1, 2, 3, 4, 5)
// index 从0开始
.elementAt(6, 100)
.subscribe(object : SingleObserver<Int> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onSuccess(t: Int) {
//找到值,返回值;找不到,返回默认值
Log.e(TAG, "---------onSuccess--------${t}-")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
})
输出结果:
//提供默认值,索引对应的值不存在,则会发送默认值,所以都会走到onSuccess。
2022-11-19 21:26:33.112 E/FilterOperator: ---------onSubscribe---------
2022-11-19 21:26:33.112 E/FilterOperator: ---------onSuccess--------100-
5.Filter⭐️
Filter运算符通过自定义条件函数来过滤符合条件的事件,仅发送符合条件的事件到下游。
示例:
Observable.just(1, 2, 3, 4, 5)
.filter(object : Predicate<Int> {
override fun test(t: Int): Boolean {
return t % 2 != 0
}
})
.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-19 21:42:12.492 E/FilterOperator: ---------onSubscribe---------
2022-11-19 21:42:12.492 E/FilterOperator: ---------onNext--------1-
2022-11-19 21:42:12.492 E/FilterOperator: ---------onNext--------3-
2022-11-19 21:42:12.492 E/FilterOperator: ---------onNext--------5-
2022-11-19 21:42:12.492 E/FilterOperator: ---------onComplete---------
6.First⭐️
仅发射可观测对象发射的第一个事件。
示例:
Observable.just(1, 2, 3, 4, 5)
.first(100)
.subscribe(object:SingleObserver<Int>{
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onSuccess(t: Int) {
Log.e(TAG, "---------onSuccess--------${t}-")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
})
输出结果:
2022-11-19 22:58:47.456 E/FilterOperator: ---------onSubscribe---------
2022-11-19 22:58:47.456 E/FilterOperator: ---------onSuccess--------1-
示例2:
Observable.empty<Int>()
.firstElement()
.subscribe(object : MaybeObserver<Int> {
override fun onSuccess(t: Int) {
//找到值走onSuccess
Log.e(TAG, "---------onSuccess--------${t}-")
}
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
override fun onComplete() {
//找不到值走onComplete
Log.e(TAG, "---------onComplete---------")
}
})
输出结果:
2022-11-19 22:58:47.459 E/FilterOperator: ---------onSubscribe---------
2022-11-19 22:58:47.459 E/FilterOperator: ---------onComplete---------
7.IgnoreElements
忽略当前Observable发出的所有项,仅调用onComplete或onError。
示例:
Observable.just(1, 2, 3, 4, 5)
.ignoreElements()
.subscribe(object : CompletableObserver {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
override fun onComplete() {
Log.e(TAG, "---------onComplete---------")
}
})
输出结果:
2022-11-19 23:07:12.933 E/FilterOperator: ---------onSubscribe---------
2022-11-19 23:07:12.933 E/FilterOperator: ---------onComplete---------
8.Last
仅发射可观测对象发射的最后一个事件。
示例:
Observable.empty<Int>()
.last(100)
.subscribe(object : SingleObserver<Int> {
override fun onSuccess(t: Int) {
//找到值,返回值;找不到,返回默认值
Log.e(TAG, "---------onSuccess--------${t}-")
}
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
})
输出结果:
2022-11-19 23:10:25.363 E/FilterOperator: ---------onSubscribe---------
2022-11-19 23:10:25.363 E/FilterOperator: ---------onSuccess--------100-
9.Simple
在周期性时间间隔内发射可观测目标发射的最新项目。
示例:
Observable.interval(1,TimeUnit.SECONDS)
.sample(3, TimeUnit.SECONDS)
.subscribe(object : Observer<Long> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onNext(t: Long) {
Log.e(TAG, "---------onNext--------${t}-")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
override fun onComplete() {
Log.e(TAG, "---------onComplete---------")
}
})
输出结果:
// 输出间隔3秒
2022-11-19 23:15:09.251 E/FilterOperator: ---------onSubscribe---------
2022-11-19 23:15:12.253 E/FilterOperator: ---------onNext--------2-
2022-11-19 23:15:15.253 E/FilterOperator: ---------onNext--------5-
2022-11-19 23:15:18.253 E/FilterOperator: ---------onNext--------7-
2022-11-19 23:15:21.253 E/FilterOperator: ---------onNext--------10-
2022-11-19 23:15:24.252 E/FilterOperator: ---------onNext--------13-
2022-11-19 23:15:27.253 E/FilterOperator: ---------onNext--------16-...
10.Skip
跳过前多少个事件的发送
示例:
Observable.interval(1,TimeUnit.SECONDS)
.take(5)
//跳过前三个事件
.skip(3)
.subscribe(object : Observer<Long> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onNext(t: Long) {
Log.e(TAG, "---------onNext--------${t}-")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
override fun onComplete() {
Log.e(TAG, "---------onComplete---------")
}
})
输出结果:
2022-11-19 23:23:10.199 E/FilterOperator: ---------onSubscribe---------
2022-11-19 23:23:14.201 E/FilterOperator: ---------onNext--------3-
2022-11-19 23:23:15.201 E/FilterOperator: ---------onNext--------4-
2022-11-19 23:23:15.201 E/FilterOperator: ---------onComplete---------
示例2:跳过前多少秒的事件发送
Observable.interval(1,TimeUnit.SECONDS)
.take(5)
//跳过前3秒
.skip(3, TimeUnit.SECONDS)
.subscribe(object : Observer<Long> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onNext(t: Long) {
Log.e(TAG, "---------onNext--------${t}-")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
override fun onComplete() {
Log.e(TAG, "---------onComplete---------")
}
})
输出结果:
2022-11-19 23:25:12.946 E/FilterOperator: ---------onSubscribe---------
2022-11-19 23:25:16.949 E/FilterOperator: ---------onNext--------3-
2022-11-19 23:25:17.949 E/FilterOperator: ---------onNext--------4-
2022-11-19 23:25:17.949 E/FilterOperator: ---------onComplete---------
11.SkipLast
跳过最后多少个事件的发送。
示例:
Observable.interval(1,TimeUnit.SECONDS)
.take(5)
// //跳过最后5秒
// .skipLast(5, TimeUnit.SECONDS)
//跳过后三个事件
.skipLast(3)
.subscribe(object : Observer<Long> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onNext(t: Long) {
Log.e(TAG, "---------onNext--------${t}-")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
override fun onComplete() {
Log.e(TAG, "---------onComplete---------")
}
})
输出结果:
2022-11-19 23:31:28.880 E/FilterOperator: ---------onSubscribe---------
2022-11-19 23:31:32.881 E/FilterOperator: ---------onNext--------0-
2022-11-19 23:31:33.881 E/FilterOperator: ---------onNext--------1-
2022-11-19 23:31:33.882 E/FilterOperator: ---------onComplete---------
12.Take⭐️⭐️
仅发射可观测对象发射的前n个项目。
示例:
Observable.interval(1,TimeUnit.SECONDS)
//仅发射前5个项目
.take(5)
// //也可以是前5秒的
// .take(5,TimeUnit.SECONDS)
.subscribe(object : Observer<Long> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onNext(t: Long) {
Log.e(TAG, "---------onNext--------${t}-")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
override fun onComplete() {
Log.e(TAG, "---------onComplete---------")
}
})
输出结果:
2022-11-19 23:35:33.981 E/FilterOperator: ---------onSubscribe---------
2022-11-19 23:35:34.983 E/FilterOperator: ---------onNext--------0-
2022-11-19 23:35:35.983 E/FilterOperator: ---------onNext--------1-
2022-11-19 23:35:36.983 E/FilterOperator: ---------onNext--------2-
2022-11-19 23:35:37.982 E/FilterOperator: ---------onNext--------3-
2022-11-19 23:35:38.983 E/FilterOperator: ---------onNext--------4-
2022-11-19 23:35:38.983 E/FilterOperator: ---------onComplete---------
13.TakeLast
仅发射可观测对象发射的后n个项目。
示例:
Observable.interval(2,TimeUnit.SECONDS)
.take(5)
.takeLast(2)
// .takeLast(2,TimeUnit.SECONDS)
.subscribe(object : Observer<Long> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onNext(t: Long) {
Log.e(TAG, "---------onNext--------${t}-")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
override fun onComplete() {
Log.e(TAG, "---------onComplete---------")
}
})
输出结果:
//注意输出的时间
2022-11-19 23:38:46.164 E/FilterOperator: ---------onSubscribe---------
2022-11-19 23:38:56.166 E/FilterOperator: ---------onNext--------3-
2022-11-19 23:38:56.166 E/FilterOperator: ---------onNext--------4-
2022-11-19 23:38:56.166 E/FilterOperator: ---------onComplete---------