转换操作

就是将一种类型的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") }

我们将前面一个乘积返回然后乘以当前的数,这可以用在计数或者一些累计操作

results matching ""

    No results matching ""