1. RxKotlin是什么?
虽然
2. 导入
for maven
1 2 3 4 5 | <dependency> <groupId>io.reactivex.rxjava2</groupId> <artifactId>rxkotlin</artifactId> <version>2.3.0</version> </dependency> |
for gradle
1 | implementation 'io.reactivex.rxjava2:rxkotlin:2.3.0' |
RxKotlin的版本号和RxJava的一致,如果RxJava1.x就用对应的RxKotlin1.x
3. 创建
3.1 创建Observable、Flowable
RxKotlin提供了
1 2 | val observable = listOf(1, 1, 2, 3).toObservable() observable.test().assertValues(1, 1, 2, 3) |
1 2 | val flowable = listOf(1, 1, 2, 3).toFlowable() flowable.buffer(2).test().assertValues(listOf(1, 1), listOf(2, 3)) |
3.2 创建Completable
通过
1 2 3 4 | var value = 0 val completable = { value = 3 }.toCompletable() assertFalse(completable.test().isCancelled()) assertEquals(3, value) |
4. Map化
4.1 转Map
1 2 3 4 | val list = listOf(Pair("a", 1), Pair("b", 2), Pair("c", 3), Pair("a", 4)) val observable = list.toObservable() val map = observable.toMap() assertEquals(mapOf(Pair("a", 4), Pair("b", 2), Pair("c", 3)), map.blockingGet()) |
4.2 转Mutimap
上面例子中,同样的
1 2 3 4 5 6 | val list = listOf(Pair("a", 1), Pair("b", 2), Pair("c", 3), Pair("a", 4)) val observable = list.toObservable() val map = observable.toMultimap() assertEquals( mapOf(Pair("a", listOf(1, 4)), Pair("b", listOf(2)), Pair("c", listOf(3))), map.blockingGet()) |
5. 合并
5.1 合并Observables
Subject的扩展方法
1 2 | val subject = PublishSubject.create<Observable<String>>() val observable = subject.mergeAll() |
相当于
1 | val observable = subject.flatMap { it } |
另外,还提供了
5.2 合并Completable、Maybe、Single
针对Completable、Maybe、Single等类型,分别提供了对应的合并操作符:
例如
1 2 3 4 5 6 7 8 | val subject = PublishSubject.create<Maybe<Int>>() val observable = subject.mergeAllMaybes() subject.onNext(Maybe.just(1)) subject.onNext(Maybe.just(2)) subject.onNext(Maybe.empty()) subject.onNext(Maybe.error(Exception("error"))) subject.onNext(Maybe.just(3)) observable.test().assertValues(1, 2).assertError(Exception::class.java) |
5.3 合并Iterable
1 2 3 4 | val observables = mutableListOf(Observable.just("first", "second")) val observable = observables.merge() observables.add(Observable.just("third", "fourth")) observable.test().assertValues("first", "second", "third", "fourth") |
1 2 3 4 5 | // ... observables.add(Observable.error(Exception("e"))) observables.add(Observable.just("fifth")) // ... observable.test().assertValues("first", "second", "third", "fourth") |
1 2 3 4 5 | // ... observables.add(Observable.error(Exception("e"))) observables.add(Observable.just("fifth")) // ... observable.test().assertValues("first", "second", "third", "fourth", "fifth") |
6. 类型转换
1 2 | val observable = Observable.just<Number>(1, 1, 2, 3) observable.cast<Int>().test().assertValues(1, 1, 2, 3) |
1 2 | val observable = Observable.just(1, "and", 2, "and") observable.ofType<Int>().test().assertValues(1, 2) |
7. 语法优化
RxKotlin中还有很多优化虽然没有创建新的扩展操作符,但是基于Kotlin的语法优势在写法上进行了优化:
比如
1 | Observable.just(1).subscribeBy(onNext = { println(it) } |
再比如,RxJava中的很多操作符必须使用RxJava内置的接口,现在可以用Kotlin的lambda替换这些接口,如
1 | Observable.zip(Observable.just(1), Observable.just(2), BiFunction<Int, Int, Int> { a, b -> a + b }) |
RxKotlin提供了与之对应的
1 | Observables.zip(Observable.just(1), Observable.just(2)) { a, b -> a + b } |