我是RxJava的新手。我正在努力链接多个API调用。这些类的结构如下:
Location(location_id, location_name)
Hub(hub_id, hub_name, location_id)
Room(device_id, room_id, room_name)LocationList被定义为
LocationList: List<Location>要求是
forEach location in LocationList{ location->
getHubs(location.location_id) //returns Single<List<Hub>>
forEach hub in hubList{ hub->
getRoom(hub.hub_id) // returns Single<Room>
store HubItem(
location.location_id,
location.location_name,
hub.hub_id,
hub.hub_name,
room_name
) in a list
}
}
output list最后的输出是一个List<HubItem> .How,通过RxJava实现上述功能吗?
发布于 2022-05-26 03:10:33
您需要使用很少的RxJava运算符来完成它,您可以嵌套它们,以便跟踪创建HubItem所需的值。
val hubItems: Single<List<HubItem>> = Observable.fromIterable(locations)
.flatMap { location ->
getHubs(location.location_id)
.flattenAsObservable { it }
.flatMapSingle { hub ->
getRoom(hub.hub_id)
.flatMap { room ->
Single.just(
HubItem(
location_name = location.location_name,
locationId = location.location_id,
hub_id = hub.hub_id,
hub_name = hub.hub_name,
room_name = room.room_name
)
)
}
}
}.toList()这是实现这一目标的一种方法。首先,您需要从列表中创建可观察的流,Observable.fromIterable()将创建一个项目流,然后在第一个flatMap中,您可以访问您的位置并返回集线器。这将返回包含普通列表的Single,因此需要将其转换为项目流。您可以通过flattenAsObservable()操作符来完成它,它将把集线器列表作为可观察的序列发出。接下来,您可以使用flatMapSingle(),在那里您可以返回您的房间。通过访问您的房间,您现在拥有了创建HubItem所需的所有数据,您将使用Single.just(...)作为一个单独的数据发出它。
最后,您可以使用toList()操作符将所有发出的项收集到Single<List<HubItem>>中。当然,实现它有多种方法,但这应该反映您在伪代码中提供的示例和类型。为了获得正常的列表,您需要订阅单个列表,但我假设订阅部分在这里并不是一个问题。
https://stackoverflow.com/questions/72379938
复制相似问题