You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 20:54:00