【问题标题】:Flatten Observable<Observable<Cursor>> to Observable<Cursor>将 Observable<Observable<Cursor>> 展平为 Observable<Cursor>
【发布时间】:2015-05-06 11:40:34
【问题描述】:

我有一个 Observable,它返回一个 Cursor 实例 (Observable&lt;Cursor&gt;)。我正在尝试利用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&lt;Observable&lt;Cursor&gt;&gt; 扁平化为Observable&lt;Cursor&gt;

【问题讨论】:

    标签: android rx-java rx-android


    【解决方案1】:

    有没有更好的方法将Observable&lt;Observable&lt;Cursor&gt;&gt; 扁平化为Observable&lt;Cursor&gt;

    是的,你可以使用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&lt;Observable&lt;Cursor&gt;&gt; 转换为Observable&lt;Cursor&gt;

    只需选择一个更适合您的。

    更新 2

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      • 2021-05-24
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      相关资源
      最近更新 更多