Как предварительно выполнить операцию, которая возвращает по одному для каждого элемента списка, возвращаемого наблюдаемой, и возвращать его в виде списка? - PullRequest
0 голосов
/ 05 октября 2018

Вопрос довольно сложный, но в коде, кажется, выглядит проще (я надеюсь)

У меня есть такие функции, как ниже

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-> /*....*/ }

Я видел этот ответ: https://stackoverflow.com/a/47676208/1461568 но есть предположение, что второй вызов можно наблюдать (у меня естьSingle)

Так как это сделать?

1 Ответ

0 голосов
/ 05 октября 2018

Вы можете сделать это следующим образом:

  1. Преобразовать trackFoos() из Observable<List<Foo>> в Observable<Foo>
  2. Для каждого Foo do getBarForFoo() и отобразить результат такон действительно возвращает Pair<Foo, Bar>
  3. (необязательно) Если вам нужно Single<List<Pair<Foo,Bar>>>, вы можете просто позвонить toList()
  4. (необязательно) Если вам действительно нужно 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 
}
...