转换操作
就是将一种类型的Observable 转换为另外一种Observable,这一节我们将会聚焦到几个常用的转换操作符上。
map
这前面我们已经用过,例子中我们使用map 将String 改为long型 。
Observable.just("A", "B", "CDDD").map { it.length }.subscribe {
println("The map change the String to long ,the value is $it")
}
Observable.just("1/3/2018", "5/9/2018", "10/12/2018")
.map { LocalDate.parse(it, dateFormat) }
.subscribe {
println("This is date: $it")
}
这两个例子看出,其实map起到了重新组装的作用,第一个例子是利用String 的length 进行组装,第二个是对观察源的格式进行组装,就好像是车间里面的某个流程,上点色,抛个光啥的!
cast
如果我们想将观察源中String 转换为Long型,来看看map怎么做
- 直接用map
Observable.just("1", "2", "a").filter {
it.matches(regex = Regex("[0-9]+"))
}.map { it.toLongOrNull() }.subscribe {
println("this is $it")
}
可以看出,需要自己写逻辑,相对比较麻烦,在这种场景下,cast 应运而生
Observable.just("1", "2", "a").filter {
it.matches(regex = Regex("[0-9]+"))
}.cast(String::class.java).subscribe {
println("this is $it")
}
其实也没有方便在哪里!
startWith
就是在所有观察源item 之前发送一个消息, 可以说是强行插入,这可以作为一种开始的标志
var observable = Observable.just("Apple", "Banana", "Cat", "Dog")
observable.startWith("Hello AH!,everyone like to go to school. if you can say about!").subscribe { println("printt: $it") }
如果你想在前面插入多个观察源,可以用数组startWithArray=, 来来。。。。
Observable.just("A", "DD", "da3").startWithArray("Fore 1", "Of @").subscribe { println("HHH: $it") }
defaultIfEmpty
当观察源没有满足条件的item时,默认发送的信息
Observable.just("A", "B").filter { it.length > 10 }.defaultIfEmpty("This is empty").subscribe { println("$it") }
当为空时,我们还想发送其他序列的信息,怎么办呢,。。。。。就用switchIfEmpty
Observable.just("A", "B").filter { it.length > 10 }.switchIfEmpty(Observable.just("wo", "de", "ge", "qu")).subscribe { println("$it") }
sorted
用于排序,可以简单排序,也可以传入比较器进行操作,也可以自己写,具体看下面例子。
Observable.just("B", "C", "A", "D", "C").sorted().subscribe { println("letter is $it") }
println("-————————————————————————————————————————-")
Observable.just("B", "C", "A", "D", "C").sorted { x, y ->
y.compareTo(x)
}.subscribe { println("letter is $it") }
delay
就是对要进行发送信息进行延迟发送,看看下面的例子,你就会发现,还是有用的
Observable.just("AAA", "BBB").delay(3, TimeUnit.SECONDS).subscribe {
println("we know it as $it")
}
Observable.interval(1, TimeUnit.SECONDS).subscribe { println("this is interval.") }
Thread.sleep(10 * 1000)
repeat
就是重复发送消息,默认是不断重复,但是可以限制次数,
Observable.just("This is test for you.", "A", "B", "----------------------").repeat(3).subscribe { println("$it") }
用着爽就好
scan
对上面的item进行扫描,对总的结果和个体进行操作, 看例子
Observable.just(1, 2, 3, 4, 5, 6, 7).scan { x, y ->
x * y
}.subscribe { println("this multi is $it") }
我们将前面一个乘积返回然后乘以当前的数,这可以用在计数或者一些累计操作