Как отфильтровать список, испускаемый наблюдаемым, используя результат другого наблюдаемого rx kotlin? - PullRequest
0 голосов
/ 29 сентября 2019

Допустим, у меня есть источник списка чисел и наблюдаемый, который может оценить каждое число в этом списке.(Необходимо использовать приведенный ниже метод. Они являются частью 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): Observable = Observable.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 голосов
/ 29 сентября 2019

Вы могли бы уменьшить это до чего-то вроде

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