美文网首页
通过示例了解 RxJava Zip 运算符

通过示例了解 RxJava Zip 运算符

作者: 小城哇哇 | 来源:发表于2022-07-25 15:19 被阅读0次

    在这篇文章中,我们将通过一个例子来学习 RxJava Zip Operator。

    根据 RxJava 官方文档,

    Zip 通过指定函数将多个 Observable 的发射组合在一起,并根据该函数的结果为每个组合发射单个项目

    Zip 运算符允许我们一次从多个 observables 中获取结果。

    假设我们有两个网络 observables,如下所示:

    • CricketFansObservable - 一个网络 observable,它返回板球爱好者的用户列表。

    • FootballFansObservable - 一个网络 observable,它返回足球迷用户列表。

    CricketFansObservable 如下:

    fun getCricketFansObservable(): Observable<List<User>> {
        return networkService.getCricketFansObservable()
    }
    

    FootballFansObservable 如下:

    fun getFootballFansObservable(): Observable<List<User>> {
        return networkService.getFootballFansObservable()
    }
    

    我们的 NetworkService 如下:

    class NetworkService {
    
        fun getCricketFansObservable(): Observable<List<User>> {
            return Observable.create<List<User>> { emitter ->
                if (!emitter.isDisposed) { // fetch data from network val data = fetchUserListFromNetwork()
                    emitter.onNext(data)
                    emitter.onComplete()
                }
            }.subscribeOn(Schedulers.io())
        }
    
        fun getFootballFansObservable(): Observable<List<User>> {
            return Observable.create<List<User>> { emitter ->
                if (!emitter.isDisposed) { // fetch data from network val data = fetchUserListFromNetwork()
                    emitter.onNext(data)
                    emitter.onComplete()
                }
            }.subscribeOn(Schedulers.io())
        }
    
        private fun fetchUserListFromNetwork(): List<User> {
            return listOf()
        }
    
    }
    

    观察者如下:

    private fun getObserver(): Observer<List<User>> {
        return object : Observer<List<User>> {
            override fun onSubscribe(d: Disposable) {
                println("onSubscribe")
            }
    
            override fun onNext(userList: List<User>) {
                println("onNext : $userList")
            }
    
            override fun onError(e: Throwable) {
                println("onError : ${e.message}")
            }
    
            override fun onComplete() {
                println("onComplete")
            }
        }
    }
    

    过滤喜欢两者的用户的实用功能

    private fun filterUserWhoLovesBoth(cricketFans: List<User>,
                                       footballFans: List<User>): List<User> {
        val userWhoLovesBoth = ArrayList<User>()
        for (footballFan in footballFans) {
            if (cricketFans.contains(footballFan)) {
                userWhoLovesBoth.add(footballFan)
            }
        }
        return userWhoLovesBoth
    }
    

    让我们一起来了解 zip 运算符。

    Observable.zip(
        getCricketFansObservable(),
        getFootballFansObservable(),
        BiFunction<List<User>, List<User>, List<User>> { cricketFans, footballFans -> // here we get both the results at a time. return@BiFunction filterUserWhoLovesBoth(cricketFans, footballFans)
        })
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(getObserver())
    

    首先,我们进行两次网络调用(在使用 Zip Operator 时并行进行),然后在获得结果后,我们正在过滤同时喜欢两者的用户。

    通过使用 RxJava Zip 操作符压缩两个 observable,两个网络调用并行运行。当两个都完成时,我们得到两个可观察的结果。这样,我们一次得到两个 observables 的结果。

    Zip 运算符的优点:

    • 当调度器被正确地提供给每个 observable 时,并行运行所有任务。

    • 完成所有任务后,在单个回调中返回所有任务的结果。

    这样我们就可以使用 RxJava Zip Operator 来解决有趣的问题。

    作者:Amit Shekhar
    链接:https://blog.mindorks.com/understanding-rxjava-zip-operator-with-example

    相关文章

      网友评论

          本文标题:通过示例了解 RxJava Zip 运算符

          本文链接:https://www.haomeiwen.com/subject/juigirtx.html