RxJava3 过滤型操作符

通过具体的示例,学习每个操作符的用法~

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---------

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值