可以平面映射并返回两个输出的任何Rx运算符



我想知道是否有适合我的用例的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 -> }

如果我的目标是登上头条的话,这很好。但我想在订阅的同时获得的是消息来源和头条新闻?是否有我不知道的操作员,或者是否有其他方法可以做到这一点?

您可以使用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)。对于MaybeFlowabale,也可以使用combineLatest()方法。

作为mohsens答案的补充:

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

PD_6

最新更新