Observable#take(Long)未在RxJava中返回所需大小的项目

时间:2018-11-17 15:52:14

标签: java kotlin rx-java rx-android rx-kotlin

我正在使用RxJava / Kotlin Observable#take()从列表中获取前50个项目。但是#take()运算符的行为不符合Rx文档的规定。

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

  

“仅发射可观察对象发射的前n个项目”

enter image description here

我有这样的功能:

我们可以看到pageSize参数是50

enter image description here

size的起始list300

enter image description here

在将#take(50)应用于该Observable之后,在下一个断点处,我仍然获得完整大小列表i.e. size = 300

enter image description here

但是just for the check,如果调试器出了点问题或可观察到的问题,我尝试仅采用displayName包含“ 9”的项目,但是这次我得到了{{1} 1}}中的每个smaller list

enter image description here

我相信9运算符并没有那么疯狂,而只是我。

2 个答案:

答案 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())