我正在使用RxJava / Kotlin Observable#take()
从列表中获取前50个项目。但是#take()
运算符的行为不符合Rx文档的规定。
在Rx文档中,#take()
定义为:
“仅发射可观察对象发射的前n个项目”
我有这样的功能:
我们可以看到pageSize
参数是50
size
的起始list
是300
在将#take(50)
应用于该Observable
之后,在下一个断点处,我仍然获得完整大小列表i.e. size = 300
但是just for the check
,如果调试器出了点问题或可观察到的问题,我尝试仅采用displayName包含“ 9”的项目,但是这次我得到了{{1} 1}}中的每个smaller list
。
我相信9
运算符并没有那么疯狂,而只是我。
答案 0 :(得分:5)
take
的行为正确,因为它只会给您50个List<FollowersEntry>
“大理石”。根据您的屏幕截图和措辞,我想您需要50 FollowersEntry
。对象容器和对象本身之间存在根本的逻辑差异。 RxJava仅看到类型为List<>
的对象序列,但无法知道要使用的嵌套对象。
因此,您要么必须在it.take(50)
内使用map
(或任何Kotlin集合函数),要么通过flatMapIterable
将列表序列展开为条目序列:
getFollowers()
.flatMapIterable(entry -> entry)
.take(50 /* entries this time, not lists */)
答案 1 :(得分:3)
仔细查看方法的返回类型-Single<List<FollowersEntity>>
。从remoteFollowersService.getFollowers()
返回的Observable是 不是 ,它发出300个FollowersEntity
项的Observable-它是发出 的Observable 项,而该单个项就是包含300个List
项的FollowersEntity
。换句话说,您需要在清单上调用Take,而不是在可观察列表上。
return remoteFollowersService.getFollowers()
.map { val size = it.size; it } // for debugging
.map { it.take(pageSize) }
.map { val size = it.size; it } // for debugging
.map { it.filter { item -> item.displayName.contains("9") } }
.single(emptyList())