首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RxJava:如何将Single<Response>转换为Single<List<Item>>

RxJava:如何将Single<Response>转换为Single<List<Item>>
EN

Stack Overflow用户
提问于 2020-10-23 12:33:06
回答 2查看 162关注 0票数 0

假设我有一个Android应用程序,其中包含以下Repository类,用于从API获取对象:

代码语言:javascript
复制
override fun fetchOrderById(orderId: Long): Single<List<ItemRow>> {
    return api.fetchOrderByIdObservable(orderId)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .map { orderResponse ->
                orderResponse.items.map { deliveryItem ->
                    deliveryItem.asItemRow()
                }
            }
}

override fun fetchOrders(): Single<OrdersResponse> {
    return api.fetchOrdersObservable()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
}

override fun fetchAllOrders(): Single<List<ItemRow>> {
     // TODO
}

具有以下数据类:

代码语言:javascript
复制
class OrdersResponse(@SerializedName("orders") val orders: List<Long>)
class OrderResponse(@SerializedName("items") val items: List<DeliveryItem>)

现在,我可以使用fetchOrderById在我的应用程序中将某个orderId的所有交付项(ItemRow)作为域对象显示在列表中。如何使用返回orderIds列表的fetchOrders来获取所有订单的所有送货项目?哪些运算符在这里会很有用?我尝试使用FlatMap,但是不能让它工作。文章的链接也是++。谢谢!

EN

回答 2

Stack Overflow用户

发布于 2020-10-23 19:28:41

你需要的运算符:switchMap()flatMap()fromArray()toList()map()它会是这样的:

代码语言:javascript
复制
fun fetchAllOrders(): Observable<List<ItemRow>> {
    return fetchOrders()
        .toObservable()
        .switchMap { ordersResponse ->
            Observable.fromIterable(ordersResponse.orders)
                .flatMap {orderId -> fetchOrderById(orderId).toObservable() }
                .toList()
                .toObservable()
        }
        .map { list -> list.flatten() }
    }
票数 1
EN

Stack Overflow用户

发布于 2020-10-31 07:51:00

这最终起作用了:

代码语言:javascript
复制
    public fun fetchAllItems(): Observable<List<ItemRow>> {
    return networkService.api.fetchOrdersObservable()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .flatMap { orderResponse ->  Observable.just(orderResponse.orders) }
            .flatMapIterable { id -> id }
            .flatMap { id -> fetchOrderById(id) }
            .flatMapIterable { itemRow -> itemRow }
            .toList()
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64493901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档