Flatten Observable <Observable <Cursor>> to Observable <Cursor>
我有一个Observable
,它返回一个Cursor
实例(Observable<Cursor>
)。我试图利用ContentObservable.fromCursor
获取onNext
回调中的每个游标行。Flatten Observable <Observable <Cursor>> to Observable <Cursor>
一个我已经想通了的解决方案是这样的结构:
ContentObservable.fromCursor(cursorObservable.toBlocking().first()) .subscribe(cursor -> {
// map to object
// add to outer collection
}, e -> {},() -> {
// do something with list of objects (outer collection)
});
这看起来有点像,因为toBlocking().first()
一个黑客,但它的作品。我不喜欢它,因为大多数处理都在onNext
回调中完成,我们必须创建外部集合来保存中间结果。
我想用这样的:
cursorObservable.map(ContentObservable::fromCursor) .map(fromCursor -> fromCursor.toBlocking().first())
.map(/* map to object */)
.toList()
.subscribe(objects -> {
// do something with list of objects
}
这仍然采用toBlocking().first()
一旦fromCursor
观察到已经完成游标被关闭,所以没有办法来映射它的对象不因工作。有没有更好的方法将Observable<Observable<Cursor>>
弄平到Observable<Cursor>
?
回答:
有没有更好的方法将
Observable<Observable<Cursor>>
平放到Observable<Cursor>
?
是的,你可以使用Observable.concat
方法:
public static void main(String[] args) { final Observable<String> observable = Observable.just("1", "2");
final Observable<Observable<String>> nested = observable.map(value -> Observable.just(value + "1", value + "2"));
final Observable<String> flattened = Observable.concat(nested);
flattened.subscribe(System.out::println);
}
UPDATE
实际上有一些其他的方法来转换Observable<Observable<Cursor>>
到Observable<Cursor>
:
- Observable.concat
- Observable.merge
- Observable.switchOnNext
只需选择一个更适合你。
更新2
另一种解决方案是修改代码中的位,并使用flatMap
操盘map
:
cursorObservable.flatMap(ContentObservable::fromCursor) .map(/* map to object */)
.toList()
.subscribe(objects -> {
// do something with list of objects (outer collection)
}
以上是 Flatten Observable <Observable <Cursor>> to Observable <Cursor> 的全部内容, 来源链接: utcz.com/qa/264164.html