为什么RxJava中的take(5)运算符返回所有对象

时间:2018-07-05 18:43:40

标签: android rx-java rx-java2

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));
}

1 个答案:

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