首页 > 解决方案 > Observable#take(Long) 未在 RxJava 中返回所需的项目大小

问题描述

我正在使用 RxJava/KotlinObservable#take()从列表中获取前 50 个项目。但是#take()操作员的行为并不符合 Rx 文档的要求。

在 Rx 文档中,#take()定义为:

“只发射 Observable 发射的前 n 个项目”

在此处输入图像描述

我有这样的功能:

正如我们所看到的,pageSize论点是50

在此处输入图像描述

和首字母sizelist300

在此处输入图像描述

在那之后,#take(50)在下Observable一个断点,我仍然得到完整的大小列表i.e. size = 300

在此处输入图像描述

但是just for the check,如果调试器或 observable 出现问题,我尝试仅获取 displayName 包含“9”的项目,但这次我smaller list9每个#displayName field.

在此处输入图像描述

我相信RxJava/Kotlin's #take()运营商没有那么疯狂,只有我。

标签: javakotlinrx-javarx-androidrx-kotlin

解决方案


take行为正确,因为它只会给你 50 个List<FollowersEntry>“弹珠”。根据您的屏幕截图和措辞,我猜您想要 50 FollowersEntry。对象容器和对象本身之间存在根本的逻辑差异。RxJava 只看到一个类型的对象序列,List<>但它不知道您打算使用的嵌套对象。

因此,您要么必须使用it.take(50)inside map(或任何 Kotlin 集合函数),要么通过以下方式将列表序列展开为条目序列flatMapIterable

getFollowers()
.flatMapIterable(entry -> entry)
.take(50 /* entries this time, not lists */)

推荐阅读