首页 > 解决方案 > 为什么 RxJava 中的 take(5) 运算符返回所有对象

问题描述

我对take(5)rxjava 中的运算符有疑问。我不为什么 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));
}

标签: androidrx-javarx-java2

解决方案


就像在评论中一样,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 替换原则,最好返回 aList而不是a。ArrayList


推荐阅读