RxJava3 合并/联合型操作符

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值