Android 获取RxJava的前10项

Android 获取RxJava的前10项,android,kotlin,rx-java,rx-android,flatmap,Android,Kotlin,Rx Java,Rx Android,Flatmap,我使用RxJava从JSONplaceholder api获取帖子列表 我只想从列表中选取前10名并保存在数据库中 我知道我需要使用take运算符,但无法确定如何使用concatMap 这是我已经有的东西 private fun loadPosts(){ subscription = Observable.fromCallable { postDao.all } .concatMap { dbPostList ->

我使用RxJava从JSONplaceholder api获取帖子列表

我只想从列表中选取前10名并保存在数据库中

我知道我需要使用take运算符,但无法确定如何使用concatMap

这是我已经有的东西

private fun loadPosts(){
        subscription = Observable.fromCallable { postDao.all }
                .concatMap { dbPostList ->
                    postApi.getPosts().concatMap { apiPostList -> 
//HERE i ONLY WANT TO TAKE 10 ITEMS AND SAVE IT (HOW CAN I USE TAKE OPERATOR HERE)
                        postDao.insertAll(*apiPostList.toTypedArray())
                        Observable.just(apiPostList)
                    }
                }
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnSubscribe { onRetrievePostListStart() }
                .doOnTerminate { onRetrievePostListFinish() }
                .subscribe(
                        { result -> onRetrievePostListSuccess(result) },
                        { onRetrievePostListError() }
                )
}

下面是我尝试过的代码,但它没有按预期工作

postApi.getPosts()
        .take(10) // DOES NOT WORK
        .concatMap { apiPostList -> 
            postDao.insertAll(*apiPostList.toTypedArray())
            Observable.just(apiPostList)
        }
getPosts()
返回一个列表。要使用
take(10)
,您必须单独发出列表中的每个元素。但是,由于您一次就发出了整个列表,这就好像
take(10)
正在尝试获取10个帖子列表,而不是10个帖子

我可以想出两种方法来解决这个问题。您可以将列表转换为可观察列表,如下所示:

postApi.getPosts()
      .flatMap { Observable.fromIterable(it) }
      .take(10)
      .toList()
发出列表中的每一项,取出其中的10项,并将结果收集到一个列表中,为您的
concatMap
做好准备

另一个选项是手动对列表进行切片:

postApi.getPosts()
      .map { it.slice(0 until 10) }
虽然不是这样,但仍然应该有效


小心点,因为这两种方法都假设列表中至少有10项。

我认为takewhile操作符只是为了这个Hello@Fred而创建的,找不到flatMapObservable。你能相应地修改我的代码吗。我对rxjava还很陌生,很抱歉,因为某种原因,我以为
getPosts
返回了一个。在这种情况下,你可以只使用
flatMap
你能给出一个例子吗,请告诉我如何使用flatMap和take这正是我发布的内容吗。必需:((列表)→ 出版商!)!发现:(列表)→ 看得见!