扁平化 Observable<Observable<Cursor>> 到 Observable<Cursor>

Flatten Observable<Observable<Cursor>> to Observable<Cursor>

我有一个 Observable returns 一个 Cursor 实例 (Observable<Cursor>)。我正在尝试利用 ContentObservable.fromCursoronNext 回调中获取每个游标的行。

我想到的解决方案之一是这样的构造:

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<Observable<Cursor>> 展平为 Observable<Cursor>

Is there a better way to flatten Observable<Observable<Cursor>> to 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);
}

更新

实际上还有一些其他方法可以将 Observable<Observable<Cursor>> 转换为 Observable<Cursor>:

选择一个更适合你的就可以了。

更新 2

另一个解决方案是稍微修改您的代码并使用 flatMap 运算符而不是 map:

cursorObservable.flatMap(ContentObservable::fromCursor)
    .map(/* map to object */)
    .toList()
    .subscribe(objects -> {
        // do something with list of objects (outer collection)
    }