组合观察源
这一节主要是将多个观察源组合成一个观察源来使用,有点像类似于前面的将多个信息压缩为单个数组或者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") }
你会发现,他只执行其中一个,虽然这里都执行第一个,当时并不代表就只执行第一个。