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()