【问题标题】:Emit one List item at a time from a Flowable从 Flowable 一次发出一个列表项
【发布时间】:2017-06-06 04:04:13
【问题描述】:

我有一个返回Flowable<RealmResults<MyClass>> 的方法。对于那些不熟悉 Realm 的人,RealmResults 只是一个简单的 List 项目。

给定一个Flowable<RealmResults<MyClass>>,我想发出每个MyClass 项目,以便我可以对每个项目执行map() 操作。

我正在寻找类似以下的内容:

getItems() // returns a Flowable<RealmResults<MyClass>>
    .emitOneAtATime() // Example operator
    .map(obj -> obj + "")
    // etc

哪个运算符会按顺序发出每个列表项?

【问题讨论】:

  • blockingNext() 之类的是否适用?它返回一个可迭代对象并阻塞,直到下一次发射。

标签: java rx-java rx-java2


【解决方案1】:

你会flatMap(aList -&gt; Flowable.fromIterable(aList))。然后您可以在每个单独的项目上map()。如果您想重新收集项目,则有toList()(注意:这将是一个新的 List 实例)。下面是一个示例,说明如何使用这些方法通过 List&lt;Integer&gt; 获取不同的类型。

List<Integer> integerList = new ArrayList<>();
Flowable<Integer> intergerListFlowable = 
            Flowable
                    .just(integerList)//emits the list
                    .flatMap(list -> Flowable.fromIterable(list))//emits one by one
                    .map(integer -> integer + 1);

【讨论】:

  • flatMapIterable(list -&gt; list) 更好一些,虽然你可以写flatMap(Flowable::fromIterable)
  • 在这种情况下它会很好地工作,但我不喜欢 flatMapIterable 在这些情况下。根据该方法的文档,似乎预期的用例涉及组合。 reactivex.io/documentation/operators/flatmap.html "flatMapIterable 变体将源项和生成的 Iterables 配对,而不是源项和生成的 Observables" 还要注意弹珠图,其中发出的项不一定按顺序返回。也没有使用方法引用来故意冗长示例。
【解决方案2】:

问题是,您要将结果保留为Flowable&lt;List&lt;MyClass&gt;&gt; 还是保留顺序的Flowable&lt;MyClass&gt;

如果是第一个,

getItems()
.concatMap(results -> Flowable
   .fromIterable(results)
   .map(/* do your mapping */)
   .toList()
)

如果是第二个,这就足够了:

getItems()
.concatMap(Flowable::fromIterable)
.map(/* do your mapping */)

【讨论】:

  • 这里的结果是什么?
  • 第 3 行中的 @PrajwalW results 在第 2 行中定义。
  • 我应该在map()中添加什么你能举个例子吗?
  • 我遇到了一个问题:我想在 textview 上显示我的 Flowable 查询 select * 语句数据你知道吗?
  • 这本身就是一个问题;确保为其附加足够的上下文。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多