【问题标题】:RxJava Flowable<List<T>> do operation on each item and then do operation on resulted listRxJava Flowable<List<T>> 对每个项目进行操作,然后对结果列表进行操作
【发布时间】:2021-10-31 01:21:45
【问题描述】:

我有一个Flowable&lt;List&lt;Item&gt;&gt; 我想要:

  1. 对每个项目进行操作
  2. 之后,我想对整个结果列表进行操作。

这现在不起作用,因为它看起来像是进入了一个无限循环::

        return list.concatMap(list ->
                    Observable.fromIterable(list)
                            .map(item -> {
                                item.setValue(value);
                                return item;
                            }).toList().toFlowable()
                            .flatMap(updatedList -> mLocalDataSource.update(updatedList)))
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread());

【问题讨论】:

  • 嗯,您这里的代码看起来不会进入无限循环。您可以更改一些运算符(flatMapIterable(l -&gt; l) 代替 concatMap(l -&gt; Observable.fromIterable(...)doOnNext 代替 mapflatMapPublisher 代替 toFlowable().flatMap(...)),但是您所拥有的应该可以工作。不过,我确实同意@PPartisan - 只是迭代列表,而不是通过 RxJava 运算符将其展平/重建,是一个更好的选择。

标签: android rx-java iterable flatmap concatmap


【解决方案1】:

我认为在flatMap()/concatMap() 中进行这项工作没有任何优势。我想说的是,如果Item 是不可变的,它会更干净。

list.concatMap(items -> {
  for(Item item : items)
    item.setValue(value);
  return mLocalDataSource.update(items)
});

【讨论】:

  • 但这需要N api级别,我不能用Rx来避免设置N api级别的条件语句吗?
  • 是的,可以使用常规的 for 循环,我会更新我的答案
  • 我很欣赏你的方法,但我希望能用 rxjava 做到这一点
  • 你可以用 RxJava 来做这一切,但在我看来,这将是更多的代码和更少的清晰度
猜你喜欢
  • 1970-01-01
  • 2010-11-14
  • 2011-11-21
  • 1970-01-01
  • 2021-06-19
  • 2021-05-08
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
相关资源
最近更新 更多