【问题标题】:Any Rx operator which could FlatMap and return both the output任何可以 FlatMap 并返回输出的 Rx 运算符
【发布时间】:2021-01-09 08:09:13
【问题描述】:

我想知道是否有适合我的用例的 RxJava 运算符。我有以下两种方法。这些是改造接口。

fun getSources(): Single<Sources>
fun getTopHeadlines(sourceCsv: String): Single<TopHeadlines>

目前我正在这样做

getSources()
    .map { sources -> 
        // convert the sources list to a csv of string 
    }
    .flatMap { sourcesCsv
        getTopHeadlines(sourcesCsv)
    }
    .subsribe {topHeadlines, error -> }

如果我的目标是获得头条新闻,这很好用。但是,我在订阅时想要获得的是消息来源和头条新闻?有没有我不知道的运营商,或者有没有其他方法可以做到这一点?

【问题讨论】:

    标签: java android kotlin rx-java rx-java2


    【解决方案1】:

    您可以使用zip() 方法来执行此操作。 zip 等待这两个项目然后发出所需的值。你可以这样使用它

    getSources()
        .map { sources -> 
            // convert the sources list to a csv of string 
        }
        .flatMap { sourcesCsv ->
            Single.zip(
                Single.just(sourcesCsv),
                getTopHeadlines(sourcesCsv),
                BiFunction { t1, t2 -> Pair(t1, t2) }
            )
        }
        
    

    然后,当您订阅此内容时,您将两个值作为一对。你可以为它做一个扩展功能,让你的生活更轻松:

    fun <T, V> Single<T>.zipWithValue(value: V) = Single.zip(
        Single.just(value),
        this,
        { t1, t2 -> Pair(t1, t2) }
    )
    

    在您的flatMap 中,您可以执行getTopHeadlines(sourcesCsv).zipWithValue(sourcesCsv)Maybe 也可以这样做,Flowabale 可以使用 combineLatest() 方法。

    【讨论】:

    • 看了几篇文章后,我可以说这是解决问题的最佳方法。简洁大方。
    【解决方案2】:

    作为对 mohsens 的补充:

    您不需要压缩它。只需在flatMap 中使用另一个map 运算符,并将这两个值组合为Pair,就像我在此示例中所做的那样:

    import io.reactivex.rxjava3.core.Single
    import org.junit.jupiter.api.Test
    
    class So65640603 {
        @Test
        fun `65640603`() {
            getSources()
                .flatMap { source -> getTopHeadlines(source).map { headLines -> source to headLines } }
                .test()
                .assertValue("v1" to 42)
        }
    }
    
    fun getSources(): Single<String> {
        return Single.just("v1")
    }
    
    fun getTopHeadlines(sourceCsv: String): Single<Int> {
        return Single.just(42)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-18
      相关资源
      最近更新 更多