android - 为什么 RxJava 中的 take(5) 运算符返回所有对象
问题描述
我对take(5)
rxjava 中的运算符有疑问。我不为什么
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)
)
另请注意,由于 Liskov 替换原则,最好返回 aList
而不是a。ArrayList
推荐阅读
- amazon-web-services - AWS IoT:多个 IoT Registry 来拆分应用程序
- python - 带有 sympy 的矩阵值函数的泰勒展开
- java - 反序列化后有没有办法在承包商之后调用方法
- c# - 在 Visual Studio 中根据解决方案配置使用不同的 appsetting.json 文件
- r - 如何在 bookdown/knitr/Rmarkdown 中添加交叉引用补充数字
- sql - 使用 regexp_substr 的 Sql 查询很慢,一旦在表中插入更多记录就会超时
- jestjs - 如何在 Jest 测试框架中创建 mockObject 而无需担心对象的属性
- php - 每次运行更新时,Composer 交替删除/重新安装相同的包
- wpf - 如何从模板外部但在同一个窗口中的资源字典绑定到控件模板内的元素?
- css - 是否可以仅使用 CSS 更改修改后的输入字段的样式?