RxJava flatMapIterable с одним
Я пытаюсь немного привести в порядок свой код, и Single
выглядит как хороший выбор для меня, поскольку я делаю что-то, что когда-либо будет испускать только один результат.
у меня проблема, хотя, как я использовал flatMapIterable
ранее, чтобы взять мой ответ (список) и сделать что-то по каждому пункту. Я не вижу, как я могу достичь этого с Single.
getListOfItems()
.flatMapIterable(items -> items)
.flatMap(item -> doSomethingWithItem())
.toList()
это отлично работает, если getListOfItems
возвращает Observable
но если я попытаюсь вернуть его Single
, то я не могу flatMapIterable
и не вижу альтернативы, любые идеи?
4 ответов
flattenAsObservable должен сделать трюк, он будет отображать Single
значение успеха Iterable
(список) и выделите каждый элемент списка как Observable
.
getListOfItems()
.flattenAsObservable(new Function<Object, Iterable<?>>() {
@Override
public Iterable<?> apply(@NonNull Object o) throws Exception {
return toItems(o);
}
})
.flatMap(item -> doSomethingWithItem())
.toList()
Я сделал что-то вроде этого
@Override
public Single<List<String>> getAvailablePaths() {
return mongoClient.rxFind("t_polygons", new JsonObject())
.toObservable()
.flatMapIterable(list -> list)
.map(json -> json.getString("path"))
.filter(Objects::nonNull)
.toList()
.toSingle();
}
основываясь на ответе от йосриза, это то, что я закончил в Котлин
getListOfItems()
.flattenAsObservable { it }
.flatMap { doSomethingWithItem(it) }
.toList()
то же самое можно достичь с помощью Котлин в map
, в зависимости от ваших предпочтений:
getListOfItems()
.map { items ->
items.map {
doSomethingWithItem(it)
}
}
вы можете конвертировать Single
to Observable
С помощью оператора toObservable()
это будет выглядеть так:
getListOfItems()
.toObservable()
.flatMapIterable(items -> items)
.flatMap(item -> doSomethingWithItem())
.toList()