RxJava: преобразование потока отдельных элементов в список

Я пытаюсь понять, как получить ответ, который возвращает список элементов, затем сделать запрос для каждого из этих элементов, который вернет объект, а затем объединит все ответы в список.

У меня он работает, отправляя их по одному, но я хотел бы упаковать их все обратно в список.

У меня это пока

getListOfData()
.flatMapIterable(list -> list)
.flatMap(item -> getData(item)

Я пробовал toList (), но я понимаю, что для этого нужен полный сигнал, прежде чем он когда-либо что-либо вернет.

Я использую rxjava 2, мне кажется, что я сделал это в rxjava 1 с помощью toList (), и он работал, как ожидалось. Любая помощь приветствуется!


person spO_oks    schedule 24.02.2017    source источник
comment
Что ж, если вы не хотите вернуть List, который содержит дыры для элементов, которые еще не были возвращены, toList - это правильный путь. И вы получите список, когда все элементы получат свои данные - onComplete не распространяется до тех пор, пока список не будет распространен.   -  person Tassos Bassoukos    schedule 24.02.2017
comment
Вот как я хочу, чтобы он вел себя, но я ничего не получаю, onComplete, кажется, никогда не происходит, но если я сделаю их индивидуальными, я вижу, что получаю x ответов от первого вызова, а затем x отправляемых элементов   -  person spO_oks    schedule 24.02.2017
comment
Излучаемый элемент - это не то же самое, что и onComplete, уверены ли вы, что каждый отдельный Observable генерирует событие onComplete?   -  person yosriz    schedule 24.02.2017


Ответы (3)


Попробуйте использовать fromIterable вместо flatMapIterable, тогда toList() должно работать

person YMY    schedule 24.02.2017
comment
Не могли бы вы привести пример этого? Я не совсем понимаю, как это сделать - person spO_oks; 24.02.2017

Это сработает?

getListOfData()
.flatMapIterable(list -> list)
.flatMap(item -> getData(item))
.flatMap(itemList -> Observable.from(itemList)) // <-- magic here. Maps each result List<Something> to Observable<Something>
person ULazdins    schedule 24.02.2017

Тайна раскрыта.

Мой оригинальный пример работает с toList ()

Проблема заключалась в том, что я не звонил onComplete на свой PublishSubject. Я просто делал onNext, может, мне не следует использовать PublishSubject, если я не хочу выдавать несколько сообщений?

person spO_oks    schedule 24.02.2017
comment
Вероятно, вы могли бы значительно упростить свой код, если не используете PublishSubject - вероятно, есть лучший способ с помощью существующих операторов. - person Tassos Bassoukos; 24.02.2017