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 &lt;Observable &lt;Cursor&gt;&gt; to Observable &lt;Cursor&gt; 的全部内容, 来源链接: utcz.com/qa/264164.html

回到顶部