我有一个Single<List<Person>>
发射50项的列表和一个Singe<List<Winner>>
发射5项的列表。Winner和Person共享一个id
字段。我想使用kotlin和rxjava最终得到一个Single<List<Person>>
。因此,它发布了一份获奖者名单。
我尝试订阅getWinners((,但没有收到任何结果。
fun getPersonObservable(): Observable<Person> =
api.getPersonListSingle().toObservable().flatMap {
Observable.fromIterable(it) }
fun getWinnerObservable(): Observable<Winner> =
api.getWinnerListSingle().toObservable().flatMap {
Observable.fromIterable(it) }
fun getWinners(): Single<List<Person>> =
getPersonObservable().zipWith(getWinnerObservable())
.filter { (person, winner) -> poerson.id == winner.id }
.map { (person, winner) -> person }.toList()
您可以对所有用户使用过滤器,其中包含任何来自获胜者的用户allUsers
和winnerUsers
是真实的测试数据,这将是您来自网络层的数据源。
import io.reactivex.rxjava3.core.Single
fun main(args: Array<String>) {
println("Hello World!")
val allUsers: Single<List<AppUser>> = Single.create { emitter ->
emitter.onSuccess(
listOf(
AppUser(1, "silentsudo"),
AppUser(2, "stackoverflow")
)
)
}
val winnerUsers: Single<List<AppUser>> = Single.create { emitter ->
emitter.onSuccess(
listOf(
AppUser(2, "stackoverflow"),
)
)
}
Single.zip(allUsers, winnerUsers,
{ user: List<AppUser>, winners: List<AppUser> ->
UserWrapper(
user,
winners
)
})
.subscribe { userWrapper ->
userWrapper
.user.filter { item -> userWrapper.winners.any { winner -> item.id == winner.id } }
.map { winnerUsers ->
println(winnerUsers)
}
}
}
data class AppUser(val id: Int, val name: String)
data class UserWrapper(val user: List<AppUser>, val winners: List<AppUser>)