扁平化 Observable<Observable<Cursor>> 到 Observable<Cursor>
Flatten Observable<Observable<Cursor>> to Observable<Cursor>
我有一个 Observable
returns 一个 Cursor
实例 (Observable<Cursor>
)。我正在尝试利用 ContentObservable.fromCursor
在 onNext
回调中获取每个游标的行。
我想到的解决方案之一是这样的构造:
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)
}
我有一个 Observable
returns 一个 Cursor
实例 (Observable<Cursor>
)。我正在尝试利用 ContentObservable.fromCursor
在 onNext
回调中获取每个游标的行。
我想到的解决方案之一是这样的构造:
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>>
toObservable<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)
}