RxJava3 转换型操作符

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值