假设我有一些热可观察某些项目的列表;
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
附近可能是单个项目的任何额外操作量。
答案 0 :(得分:3)
您可以在toList
创建的Observable上对单个项目和最终flatMap
运算符执行所有操作。这样,您就会收到onComplete调用,toList
将收集并转换项目。
observable.flatMap(list -> {
return Observable.from(list)
.filter(Item::isFiltered)
.toList()
})
.subscribe(this::onNext, this::onError)