【问题标题】:How to preform operation which returns single for each element of list returned by observable and return it as a list?如何执行为 observable 返回的列表的每个元素返回单个并将其作为列表返回的操作?
【发布时间】:2018-10-05 10:42:44
【问题描述】:

这个问题很复杂,但代码看起来更简单(我希望)

我有一个像下面这样的功能

fun trackFoos(): Observable<List<Foo>> {/*....*/}
fun getBarForFoo(fooState: Foo.State): Single<Bar>

而且我有一些代码绑定到应用程序的其他部分,所以我不能改变太多。

Observable.combineLatest(
              trackFoos(),
              Observable.interval(1, TimeUnit.SECONDS),
              BiFunction() {foos: List<Foo>, _:Long -> foos}
             ).subscribe { foos -> /*....*/ }

现在我还需要使用 getBarForFoo 为每个 foo 对象传递 Bar 对象

所以我需要使用trackFoos()getBarForFoo() 编写trackPairOfFooAndBar() 来使用它,如下所示:

Observable.combineLatest(
              trackPairOfFooAndBar(),
              Observable.interval(1, TimeUnit.SECONDS),
              BiFunction() {fooBarList: List<Pair<Foo,Bar>>, _:Long -> fooBarList}
             ).subscribe { fooBarList-> /*....*/ }

我看到了这个答案:https://stackoverflow.com/a/47676208/1461568 但假设第二次调用是可观察到的(我有单次调用)

那该怎么做呢?

【问题讨论】:

    标签: rx-java2


    【解决方案1】:

    你可以这样做:

    1. trackFoos()Observable&lt;List&lt;Foo&gt;&gt; 转换为Observable&lt;Foo&gt;
    2. 对于每个Foo 执行getBarForFoo() 并映射结果,使其真正返回Pair&lt;Foo, Bar&gt;
    3. (可选)如果您需要Single&lt;List&lt;Pair&lt;Foo,Bar&gt;&gt;&gt;,您可以拨打toList()
    4. (可选)如果您真的需要Observable,那么您可以拨打toObservable()

    在代码中:

    fun trackPairOfFooAndBar() : Observable<Pair<Foo, Bar>> {
        return trackFoos()            
                .flatMapIterable { it } // or flatMap {list -> Observable.fromIterable(list)}
                .flatMapSingle { foo -> getBarForFoo(foo.state).map { foo to it } }
                // optional, depending what is the final signature that you want
                //.toList().toObservable 
    }
    

    【讨论】:

    • 谢谢。我会检查。我真的需要观察结果。如果任何 Foos 发生变化,应用程序必须更新 UI。
    猜你喜欢
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 2021-07-03
    • 2014-05-26
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多