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

问题描述

假设我有一个具有以下Repository类的Android应用,可从API提取对象:

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
}

具有以下数据类:

class OrdersResponse(@Serializedname("orders") val orders: List<Long>)
class OrderResponse(@Serializedname("items") val items: List<DeliveryItem>)

现在,我可以使用fetchOrderById获取某个orderId的所有交货项目(ItemRow),作为我应用程序中的域对象以显示在列表中。如何使用fetchOrders,它返回orderId的列表以获取所有订单的所有交货项目?哪些运算符在这里有用?我玩过FlatMap,但无法正常工作。链接文章也将是++。谢谢!

解决方法

您需要的操作员:switchMap()flatMap()fromArray()toList()map()就像这样:

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

最终成功了:

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