组合观察源

这一节主要是将多个观察源组合成一个观察源来使用,有点像类似于前面的将多个信息压缩为单个数组或者map进行输出

merge

    fun testRxJava() {
        var source1 = Observable.just("ASSS", "HSHHS")
        var source2 = Observable.just("Hello", "World")
        var source3 = Observable.just(1, 2, 3)
        var source4 = Observable.just(Student(), Student(), Student(name = "niebin"))
        Observable.merge(source1, source2, source3, source4).subscribe {
            if (it is Student) {
                var stu = it as? Student
                println("name is ${stu?.name}")
            } else {
                println("Let you see see: $it")
            }

        }
    }
}

data class Student(var name: String = "Who must not be named", var age: Int = 18)

通过上面例子,我们可以看出

  • 组合的源类型可以不一样
  • merge 可以组合的个数是两个到4个观察源
  • 可以组合打包到同一个观察者中,统一处理
  • 看看 有限的观察源,和无限的观察源 怎么组合使用
        var source5 = Observable.interval(1, TimeUnit.SECONDS)
        Observable.merge(source5, source1).subscribe { println("this is $it") }
        Thread.sleep(5000)

mergeWith

和merge 功能类似,区别是

  • 一个观察源对另一个观察源进行合并,而不是总的合并
  • 只能是相同信息源进行合并, 如果不同则不能合并
  • 一次只能合并一个观察源,这比merge可能性少了很多
 source1.mergeWith(source2).subscribe { println("$it") }

mergeArray

如果你有很多(4个以上)观察源需要合并,那么mergeArray是个不错的选择,可以合并观察源数组,里面是可变长参数

   Observable.mergeArray(source1, source2, source3, source4).subscribe { println("this array is $it") }

flatMap

这也是一个组合操作,在rx中是相当关键的,他的目的就是将观察源重新组合,可以发送相同类型的信息源,也可以发送不同的信息源,

        Observable.just("ASDSD", "SDSDSD").flatMap {
            Observable.fromIterable(it.split(""))
        }.subscribe { println("This is letter of $it") }

         Observable.just(1, 2).flatMap {
            if (it == 1) {
                Observable.just("hhe")
            } else {
                Observable.just(1)
            }
        }.subscribe { println("This is $it") }

concat

和merge 类似,concat 是多个观察源的串联,但是唯一区别于merge就是,concat 可以保证观察源的执行顺序,但是merge是不会保证顺序的。注意

  • 最好不要用在无限的观察源中
  • 如果在乎顺序就用concat 否者可以用merge

concatWith和mergeWith,concatMap和flatMap的用法都是相似的,但是主要看是否需要次序,concat是带顺序的。

ambiguous

就是如果哪一个首先执行,后面就会一直执行,目的就是当使用相同的数据或事件的时候,我们需要让具有优势的数据首先执行,这又点像生物中的优胜劣汰,择选出最好的一个。

var source1 = Observable.just("SADsd", "SDsdassd")
        var source2 = Observable.just("This", "SDSDSDS")
        Observable.amb(mutableListOf(source1, source2)).subscribe { println("Letter is $it") }
        Observable.amb(mutableListOf(source2, source1)).subscribe { println("Letter is $it") }

你会发现,他只执行其中一个,虽然这里都执行第一个,当时并不代表就只执行第一个。

results matching ""

    No results matching ""