RxJava。将热的observable of list转换为单个项目流,处理它并转换回列表

时间:2017-01-13 15:02:36

标签: java rx-java observable

假设我有一些可观察某些项目的列表;

Observable<List<Item>> observable = ...;

我需要将其转换为单个项目流并对每个项目执行一些操作,例如过滤,之后我应该将其转换回列表并在订阅者的onNext方法中处理它:

observable.flatMap(Observable::from)
    .filter(Item::isFiltered)
    .toList()
    .subscribe(this::onNext, this::onError)

public void onNext(List<Item> items) {...}

从第一次看起来似乎没问题,但它不是,因为我们的observable是 hot ,所以toList()不会被执行(因为它等待来源)可观察的完成)和整个流卡住了。

我该如何解决这个问题?另请注意,filter附近可能是单个项目的任何额外操作量。

1 个答案:

答案 0 :(得分:3)

您可以在toList创建的Observable上对单个项目和最终flatMap运算符执行所有操作。这样,您就会收到onComplete调用,toList将收集并转换项目。

observable.flatMap(list -> {
     return Observable.from(list)
                        .filter(Item::isFiltered)
                        .toList()
  })
  .subscribe(this::onNext, this::onError)