假设我有一个数字列表的来源,并且可以观察到它可以对列表中的每个数字进行赋值。 (以下方法必须使用。它们是我必须使用的API的一部分)
fun getNumberListSource() : Observable<List<Int>> {...}
fun getOddChecker(value: Int): Observable<Boolean> {...}
假设来源看起来像这样:
class NumberSource {
private val source = BehaviorSubject.create<List<Int>>()
fun getNumberListSource(): Observable<List<Int>> = source.doOnNext { println("doOnNext :)") }
fun start(){
Thread {
Thread.sleep(1000)
source.onNext(listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12))
Thread.sleep(1000)
source.onNext(listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12))
Thread.sleep(1000)
source.onComplete()
}.start()
}
}
fun getOddChecker(i:Int):可观察=可观察.just(i%2 == 0)
在流的末尾,我需要具有奇数列表。 所以我完成了该代码:fun main() {
val numberSource = NumberSource()
numberSource.start()
println("== started ==")
numberSource.getNumberListSource()
.flatMap {
Observable.fromIterable(it)
.flatMap (
{getOddChecker(it)},
{a, b -> a to b}
)
.filter { it.second }
.map { it.first }
.toList()
.toObservable()
}
.subscribe({ println("onNext: $it")},{},{ print("action:onComplete")})
}
代码上方的输出:
== started ==
doOnNext :)
onNext: [2, 4, 6, 8, 10, 12]
doOnNext :)
onNext: [2, 4, 6, 8, 10, 12]
action:onComplete
上面的代码完成了我想要的,但是我不得不使用Pair
类。
.filter { it.second }
.map { it.first }
似乎不太可读。 那么,有没有哪个操作员可以简化该代码?
答案 0 :(得分:1)
您可以将其简化为这样的
getNumberListSource()
.flatMap { Observable.fromIterable(it)
.flatMap { item -> getOddChecker(item).filter {it}.map { item } }
.toList().toObservable()
}
.subscribe({ println("onNext: $it")},{},{ print("action:onComplete")})