我对 rxjava 中的 take(5)
运算符有疑问。我不明白为什么
subscribe {ui.showLikes(it)}
始终返回数据库中的所有对象。运算符 take()
不起作用?我做错了什么?感谢您的帮助。
fun downloadLikes(userId: String, skillId: Int) {
val subscription = apiService.rxListPluses()
.flatMap {
localDataSource.savePluses(it)
apiService.getUserDetails()
}
.flatMap {
localDataSource.rxGetLikeItems(userId, skillId)
.take(5)
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
ui.showLikes(it)
}
bindToLifecycle(subscription)
}
public Observable<ArrayList<LikeItem>> rxGetLikeItems(String userId, int skillId) {
return Observable.fromCallable(() -> getLikeItems(userId, skillId));
}
最佳答案
在评论中点赞,rxGetLikeItems
发出 ArrayList<LikeItem>
, 不是 LikeItem
.
所以 rxGetLikeItems(your, mum).take(5)
意思是“取前五个 List<LikeItem>
发出”
为了更清楚地使用另一个示例,假设函数:
fun getList() : Observable<List<Int>> {
return Observable.just(listOf(1,2,3,4,5,6,7,8,9,10))
}
如果我们调用 take(5)
对此:
getList()
.take(5)
.test()
.assertResult(
listOf(1,2,3,4,5,6,7,8,9,10)
)
我们得到第一个列表作为发射。
您可能想要的是类似 flatMapIterable
的东西:
getList()
.flatMapIterable { x -> x }
.take(5)
.test()
.assertResult(
1,2,3,4,5
)
或者如果您需要发出一个列表:
getList()
.flatMapIterable { x -> x }
.take(5)
.toList()
.test()
.assertResult(
listOf(1,2,3,4,5)
)
另请注意,最好返回 List
而不是 ArrayList
如果可能的话,因为 Liskov 替换原则。
关于android - 为什么 RxJava 中的 take(5) 运算符返回所有对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51197994/