如何使用另一个可观察的rx kotlin的结果过滤可观察的发出的列表?

时间:2019-09-28 23:07:14

标签: rx-java2 rx-kotlin2

假设我有一个数字列表的来源,并且可以观察到它可以对列表中的每个数字进行赋值。 (以下方法必须使用。它们是我必须使用的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 }

似乎不太可读。 那么,有没有哪个操作员可以简化该代码?

1 个答案:

答案 0 :(得分:1)

您可以将其简化为这样的

   getNumberListSource()
           .flatMap { Observable.fromIterable(it)
                    .flatMap { item -> getOddChecker(item).filter {it}.map { item } }
                    .toList().toObservable()
            }
            .subscribe({ println("onNext: $it")},{},{ print("action:onComplete")})