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));
}
答案 0 :(得分:3)
与评论类似,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替换原则,最好返回List
而不是ArrayList
。