【问题标题】:Get top 10 items RxJava获取前 10 项 RxJava
【发布时间】:2019-12-17 20:48:26
【问题描述】:

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

https://jsonplaceholder.typicode.com/posts

我只想从列表中取出前 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)
        }

【问题讨论】:

  • 我认为 takewhile 运算符就是为此而生的

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


【解决方案1】:

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

不是那么 rx-ish 但仍然可以工作。

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

【讨论】:

  • 你好@Fred,找不到 flatMapObservable。你能相应地修改我的代码吗?我对 rxjava 很陌生
  • 抱歉,由于某种原因,我认为 getPosts 正在返回单曲。在这种情况下,您可以使用 flatMap
  • 你能举个例子请教如何使用 FlatMap 和 Take
  • 这正是我发布的内容
  • 你好 Fred 当我尝试它时,这是我得到的类型不匹配。必需:((List) → Publisher!)!找到:(List) → Observable!
猜你喜欢
  • 2020-09-13
  • 1970-01-01
  • 2020-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2015-08-18
  • 1970-01-01
相关资源
最近更新 更多