如何转换 Flow<List 中的每个元素<User>>并返回新的 Flow<List<UserWithNumber>>



困难在于我把数字包装在一个流中。

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) }
}
}

相关内容

  • 没有找到相关文章

最新更新