📜  通过示例了解 RxJava Zip 运算符

📅  最后修改于: 2022-05-13 01:54:41.878000             🧑  作者: Mango

通过示例了解 RxJava Zip 运算符

根据官方 RxJava 文档“Zip 使用给定函数组合多个 Observables 的发射,并根据每个组合的该函数的结果发射单个项目”。 zip运算符使我们能够同时从多个 observable 中获取结果。

图 1. 了解 Zip 结构。

假设我们有以下两个网络可观察量: GfGCoursesData – 一个网络可观察量,可生成 Geeks for Geeks 提供的课程列表。 GfGDSA – 一个网络可观察对象,返回 Geeks 数据结构课程的 Geeks 列表

GfFCourses 注意到以下几点:

Kotlin
fun getGfGCoursesData(): Observable> {
    return networkService.getGfGCoursesData()
}


Kotlin
fun getGFGDSA(): Observable> {
    return networkService.getGFGDSA()
}


Kotlin
class NetworkService {
      
    fun gfgCourses(): Observable> {
        return Observable.create> { shooterData ->
            if (!shooterData.isDisposed) {
                // fetch gfgData from network
                val gfgData = fetchUserListFromNetwork()
                shooterData.onNext(gfgData)
                shooterData.onComplete()
            }
        }.subscribeOn(Schedulers.io())
    }
  
    fun gfgDSA(): Observable> {
        return Observable.create> { shooterData ->
            if (!shooterData.isDisposed) {
                // fetch gfgData from network
                val gfgData = fetchUserListFromNetwork()
                shooterData.onNext(gfgData)
                shooterData.onComplete()
            }
        }.subscribeOn(Schedulers.io())
    }
  
    private fun fetchUserListFromNetwork(): List {
        return listOf()
    }
  
}


Kotlin
private fun getTheObserver(): Observer> {
    return object : Observer> {
        override fun gfgSubscribed(d: Disposable) {
            println("gfgSubscribed")
        }
  
        override fun onNext(userList: List) {
            println("onNext : $userList")
        }
  
        override fun onError(e: Throwable) {
            println("onError : ${e.message}")
        }
  
        override fun onComplete() {
            println("onComplete")
        }
    }
}


Kotlin
private fun CommonCourses(GfGCourses: List,
                                   gfgDSACourses: List): List {
    val CommonCourses = ArrayList()
    for (gfgDSACourse in gfgDSACourses) {
        if (GfGCourses.contains(gfgDSACourse)) {
            CommonCourses.add(gfgDSACourse)
        }
    }
    return CommonCourses
}


Kotlin
Observable.zip(
    gfgCourses(),
    gfgDSACourses(),
    BiFunction, List, List> { cricketFans, gfgCourses->
        // fetching results at once.
        return@BiFunction filterUserWhoLovesBoth(cricketFans, gfgDSA)
    })
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(getObserver())


GFGDSA 如下:



科特林

fun getGFGDSA(): Observable> {
    return networkService.getGFGDSA()
}

这是我们的 NetworkService:

科特林

class NetworkService {
      
    fun gfgCourses(): Observable> {
        return Observable.create> { shooterData ->
            if (!shooterData.isDisposed) {
                // fetch gfgData from network
                val gfgData = fetchUserListFromNetwork()
                shooterData.onNext(gfgData)
                shooterData.onComplete()
            }
        }.subscribeOn(Schedulers.io())
    }
  
    fun gfgDSA(): Observable> {
        return Observable.create> { shooterData ->
            if (!shooterData.isDisposed) {
                // fetch gfgData from network
                val gfgData = fetchUserListFromNetwork()
                shooterData.onNext(gfgData)
                shooterData.onComplete()
            }
        }.subscribeOn(Schedulers.io())
    }
  
    private fun fetchUserListFromNetwork(): List {
        return listOf()
    }
  
}

例如,考虑以下观察者:

科特林

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

用于识别共同课程的实用工具。

科特林

private fun CommonCourses(GfGCourses: List,
                                   gfgDSACourses: List): List {
    val CommonCourses = ArrayList()
    for (gfgDSACourse in gfgDSACourses) {
        if (GfGCourses.contains(gfgDSACourse)) {
            CommonCourses.add(gfgDSACourse)
        }
    }
    return CommonCourses
}

让我们把它们放在一起,以便更好地理解 zip运算符。

科特林

Observable.zip(
    gfgCourses(),
    gfgDSACourses(),
    BiFunction, List, List> { cricketFans, gfgCourses->
        // fetching results at once.
        return@BiFunction filterUserWhoLovesBoth(cricketFans, gfgDSA)
    })
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(getObserver())

概括

首先,我们发出两个网络请求(同时因为我们使用的是 Zip Operator),然后我们选择 DSA 的课程,它们是主要课程的一部分。通过使用 RxJava Zip运算符压缩两个 observables 来并行执行两个网络调用。当两个 observable 都完成后,我们就得到了两者的结果。我们以这种方式同时获得两个 observables 的结果。

结论与 RxZip 的一些优势

  • 如果调度程序被适当地分配给每个可观察对象,则并行运行所有作业。
  • 当所有作业完成后,在单个回调中返回所有作业的结果。
  • 我们可以利用 RxJava Zip Operator 以这种方式解决这个有趣的问题。
想要一个更快节奏和更具竞争力的环境来学习 Android 的基础知识吗?
单击此处前往由我们的专家精心策划的指南,旨在让您立即做好行业准备!