继续打包
这一节,我们继续学习打包
Zip
这个看上就是打包的,他的目的就是将两个观察源进行打包起来,这里有区别,就是他能够将几个item 进行重装处理,主要是利用BiFunction进行重装
var source1 = Observable.just("SADsd", "SDsdassd")
val source3 = Observable.range(1, 6)
Observable.zip<String, Int, String>(source1, source3, BiFunction<String, Int, String> { x, y -> "$x : $y" }).subscribe { println("Letter is $it") }
这和前面的merge,concat 是不一样的,打入同一个观察源,而且还可以对其中的信息进行合并处理,当时这里是一对一的,如果两个信息源是不一样的,那么以最短的哪一个为主, 上面例子中,souce3如果是单独发送,则有5个信息源可以发送,但是由于source1只有两个信息源,所以当我们输出的时,只会输出两个。
这里重点说说和merge 的区别,merge 主要是将观察源进行线性组合,只是简单的将各个观察源放在同一个观察源中使用,信息源是不会丢失的,但是zip 的方式有点不一样,如果把观察看成是一个数组,那么每一次,我们都会从数组中取同一序号的信息源进行拼装,具体拼装方式你可以自己定义,你甚至可以对某些信息源不进行处理,但是merge只能对单个信息源进行处理,就好比过隧道,merge是单行道进行排队前进,而zip就是多行道并肩前进,还可以相互递眼神进行交流。
zipWith
zipWith 功能的方面和zip是差不多的,只是他是针对一个已经存在的观察源,对其他观察源进行打包处理,我将两个拥有不同长短的信息源,作为调用方,看看是否能影响输出,从实验的结果来看,是没有什么影响的。
source1.zipWith(source3, BiFunction<String, Int, String> { le, num ->
"$le is at num $num"
}).subscribe { println("Print: $it") }
source3.zipWith(source1, BiFunction<Int,String,String>{ letter, num ->
"Front: $letter is at $num"
}).subscribe { println("$it") }
zip集合interval
主要思路是一样的,只是现在带有interval的延迟功能,爽不爽!
val strings = Observable.just("Alpha", "Beta", "Gamma", "Delta", "Epsilon")
val seconds = Observable.interval(1, TimeUnit.SECONDS)
Observable.zip(strings, seconds, BiFunction<String, Long, String> { letter, seconds ->
"$letter is at $seconds"
}).subscribe { println("$it : ${LocalTime.now()}") }
Thread.sleep(6000)
combine latest合并最后
和zip类似,都可以对信息源排队处理,但是这里只合并最后一个,当时需要注意的是,当时最后一个观察源时,会正常输出,而不是最后一个信息源,这可能就是合并最后的另一种表现吧
var source1 = Observable.just("SADsd", "SDsdassd", "SDSDSD", "DSDSDS", "Sdsw", "aaaa")
var source2 = Observable.just("BBBBBB", "CCCCCCCCCCC")
val source3 = Observable.range(1, 6)
Observable.combineLatest(source1, source2, source3, Function3<String, String, Int, String> { let, let2, num ->
"$let --- $let2 is at num $num"
}).subscribe { println(it) }
Observable.combineLatest(source3, source2, source1, Function3<Int, String, String, String> { let, let2, num ->
"$let --- $let2 is at num $num"
}).subscribe { println(it) }
withLatestFrom
这是combine latest 的变种,调用者的信息源正常发送,被调用者只组合最后一个,来来来,看代码
source1.withLatestFrom(source2, BiFunction<String, String, String> { s1, s2 ->
"$s1 and $s2"
}).subscribe { println(it) }
/** 输出
SADsd and CCCCCCCCCCC
SDsdassd and CCCCCCCCCCC
SDSDSD and CCCCCCCCCCC
DSDSDS and CCCCCCCCCCC
Sdsw and CCCCCCCCCCC
aaaa and CCCCCCCCCCC
**/
分组group
就是将观察源进行分组,相当分组打包在GroupedObservable中
var source1 = Observable.just("SADsd", "SDsdassd", "SDSDSD", "DSDSDS", "Sdsw", "aaaa", "bbbb")
var byLengths = source1.groupBy {
it.length
}
byLengths.flatMapSingle { it.toList() }.subscribe { println(it) }
/**打印
[Sdsw, aaaa, bbbb]
[SADsd]
[SDSDSD, DSDSDS]
[SDsdassd]
*/