我遇到了需要组合多个 Arrow-kt 的情况:鉴于以下情况
typealias ApiResult<T> = Either<Exception, T>
interface ApiClient {
fun getUserIds(): ApiResult<List<String>>
fun getUserName(id: String): ApiResult<String>
fun getUserAge(id: String): ApiResult<Int>
fun getUserEmail(id: String): ApiResult<String>
}
data class UserData(val name: String, val age: Int, val email: String)
fun collectSomeHow(
name: ApiResult<String>,
age: ApiResult<Int>,
email: ApiResult<String>
):ApiResult<UserData> = TODO()
val apiClient:ApiClient = getApiClient()
val result: ApiResult<List<ApiResult<UserData>>> = apiClient.getUserIds().map{ ids->
ids.map{ id->
val name = apiClient.getUserName(id)
val age = apiClient.getUserAge(id)
val email = apiClient.getUserEmail(id)
collectSomeHow(name, age, email)
}
}
如何才能collectSomeHow
实施回归ApiResult<UserData>
?
您可以使用
zipOrAccumulate
来组合多个 Either:右边是你在变换 lambda 中指定的(最后一个参数,这里为了简洁起见引用了函数
::UserData
)。左边是可能发生的所有异常的列表(因为每个 ,最多三个name
,age
并且email
可能是左边的)。由于最终返回类型应为仅具有单个异常的 Either,因此我过去
mapLeft
只从异常列表中提取发生的第一个异常,其余的异常将被吞掉。请根据需要进行调整。