如何使用Kotlin Flow链式调用API获取带宠物信息的用户列表
实现代码
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.concatMap import kotlinx.coroutines.flow.flattenAsFlow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.toList class UsersRepository(private val api: Api) { val users: Flow<List<User>> = flow { // 拉取全量用户DTO列表 emit(api.users()) } // 等价于RxJava的flatMapIterable,将列表拆分为单个UserDTO逐个下发 .flattenAsFlow { it } // 等价于RxJava的concatMap,按原有顺序逐个拉取每个用户的宠物列表,严格保持返回顺序 .concatMap { userDto -> flow { emit(api.pets(userDto.id)) }.map { petsDtoList -> // 组装为最终的User实体 User( id = userDto.id, pets = petsDtoList.map { Pet(it.name) } ) } } // 等价于RxJava的toList,将所有组装完成的User合并为列表后下发 .toList() }
可选优化
如果不需要严格保持用户列表和users()接口返回的顺序一致,可以将concatMap替换为flatMapMerge并指定并发数,大幅提升请求效率,示例:
.flatMapMerge(concurrency = 4) { userDto -> flow { emit(api.pets(userDto.id)) } .map { petsDtoList -> User( id = userDto.id, pets = petsDtoList.map { Pet(it.name) } ) } }
内容的提问来源于stack exchange,提问作者Diego Palomar
相关产品推荐
相关产品推荐

