RxJava Nested Observables выставляет значения - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть следующий код, который работает, как ожидалось. Тем не менее, я не люблю иметь блокирующий Get. Есть ли способ переместить вызов getSingle () выше в «глобальную» переменную Observable, чтобы избежать этого? Другими словами, я бы хотел, чтобы getSingle завершился без использования blockingGet, прежде чем переходить к коду. Обратите внимание, что в вызове карты мне нужен доступ к ответу foos, bar и getSingle ().

Любая помощь приветствуется!

public List<Baz> example(Single<Collection<Foo>> foosSingle, Collection<Bar> bars) {
  return foosSingle
    .flatMap(foos -> 
      Observable.fromIterable(bars)
        .map(bar -> getBaz(foos, getSingle(bar.getBlah()).blockingGet(), bar.getFlaz())
        .toList()
    );
}

FWIW Я попытался заменить вызов .map начто-то вроде этого:

 .map(bar -> Lists.ArrayList(bar, getSingle(bar.getBlah()).blockingGet())
 .map(list -> getBaz(foos, list.get(1), list.get(0).getFlaz())

, который дает мне доступ ко всем нужным мне переменным, но не решает проблему blockingGet.

1 Ответ

3 голосов
/ 05 ноября 2019

Используйте .flatMap вместо карты

public List<Baz> example(Single<Collection<Foo>> foosSingle, final Collection<Bar> bars) {
  return foosSingle
    .flatMap(foos -> 
      Observable.fromIterable(bars)
        .flatMapSingle(bar -> {
          return getSingle(bar.getBlah())
            .map(x -> getBaz(foos, x, bar.getFlaz()))
        })
        .toList()
    );
}
...