困难在于我把数字包装在一个流中。
UserWithNumber的实现
data class UserWithNumber(val user: User, val number: Int)
用户功能实现:
fun getUsers(): Flow<List<User>> {
//return users
}
fun getNumberForUser(userId: Long): Flow<Int> {
//return number
}
fun getUsersWithNumber(): Flow<List<UserWithNumber>> {
return getUsers()
//TODO transform every User to UserWithNumber
}
在RxJava中,我可以很容易地通过flatMapIterable和toList()实现。
fun getUsersWithNumber(): Observable<List<UserWithNumber>> {
return getUsers() // return Observable<List<User>>
.flatMapIterable { it } // unfolds list in Observable<User>
.flatMap { it.getNumberForUser(it.id) } // make transform function to every user
.toList() // wrap to list
}
如何使用kotlin协程?
我认为你应该可以这样做:
fun getUsersWithNumber(): Flow<List<UserWithNumber>> {
return getUsers().map { userList ->
userList.map { user ->
// transform User to UserWithNumber here
// (possibly with an extension function?)
}
}
}
我唯一不确定的是你想如何进行转换,因为根据你发布的内容,你有返回Flow<Int>
的getNumberForUser
,而不是Flow<UserWithNumber>
。
实现这一点的最佳方法是使用挂起函数。可能您不需要仅仅为获取userNumber而流。
修改方法签名为suspend fun getNumberForUser(userId: Long): Int
那么你可以很容易地将你的Flow<User>
映射到Flow<UserWithNumber>
。
fun getUsersWithNumber(): Flow<List<UserWithNumber>> {
return getUsers()
.map { users ->
users.map { getNumberForUser(it.id) }
}
}