我想知道是否有适合我的用例的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)
。对于Maybe
和Flowabale
,也可以使用combineLatest()
方法。
作为mohsens答案的补充:
您不需要压缩它。只需在Pair
中使用另一个flatMap
运算符,并将两个值组合为CCD_10,就像我在本例中所做的那样: