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