Как предварительно выполнить операцию, которая возвращает по одному для каждого элемента списка, возвращаемого наблюдаемой, и возвращать его в виде списка?
Вопрос довольно сложный, но в коде, кажется, выглядит проще (я надеюсь)
У меня есть такие функции, как ниже
fun trackFoos(): Observable<List<Foo>> {/*....*/}
fun getBarForFoo(fooState: Foo.State): Single<Bar>
И у меня был какой-то код, который привязан к другим частям приложений, поэтому я не могу изменить его слишком сильно.
Observable.combineLatest(
trackFoos(),
Observable.interval(1, TimeUnit.SECONDS),
BiFunction() {foos: List<Foo>, _:Long -> foos}
).subscribe { foos -> /*....*/ }
И теперь мне нужно передать также объект Bar для каждого объекта foo, используя этот getBarForFoo
Так что мне нужно написать trackPairOfFooAndBar()
с помощью trackFoos()
а также getBarForFoo()
использовать его, как показано ниже:
Observable.combineLatest(
trackPairOfFooAndBar(),
Observable.interval(1, TimeUnit.SECONDS),
BiFunction() {fooBarList: List<Pair<Foo,Bar>>, _:Long -> fooBarList}
).subscribe { fooBarList-> /*....*/ }
Я видел этот ответ: /questions/17863258/rxjava-obedinyaet-posledovatelnost-zaprosov/17863271#17863271 но есть предположение, что второй вызов можно наблюдать (у меня есть Single)
Так как это сделать?
1 ответ
Решение
Вы можете сделать это так:
- преобразование
trackFoos()
отObservable<List<Foo>>
вObservable<Foo>
- Для каждого
Foo
делатьgetBarForFoo()
и результат карты, чтобы он действительно возвращаетPair<Foo, Bar>
- (Необязательно) Если вам нужно
Single<List<Pair<Foo,Bar>>>
ты можешь просто позвонитьtoList()
- (Необязательно) Если вам действительно нужно
Observable
тогда вы можете просто позвонитьtoObservable()
В коде:
fun trackPairOfFooAndBar() : Observable<Pair<Foo, Bar>> {
return trackFoos()
.flatMapIterable { it } // or flatMap {list -> Observable.fromIterable(list)}
.flatMapSingle { foo -> getBarForFoo(foo.state).map { foo to it } }
// optional, depending what is the final signature that you want
//.toList().toObservable
}