我将我的项目从Spring迁移到Ktor,并决定替换最初是Reactor到RxJava 2的反应式流的实现。尽管在反应式末尾尝试将多个流组合成单个流时遇到了一些问题。管道。这是它的样子:
internal interface Aggregator {
fun acquireSomethingFromSomewhere(keyword: String): Flowable<Some>
}
fun acquireSomething(keyword: String) = Flowable
.fromIterable(aggregators)
.map { it.acquireSomethingFromSomewhere(keyword) }
.flatMap { ??? }
问题是,每次acquireSomethingFromSomewhere
的调用都会返回Flowable<Some>
,是否有任何运算符可以帮助我将它们合并到一个流的末尾?在Reactor中,我只是使用了:
fun acquireSomething(keyword: String) = Flux
.fromIterable(aggregators)
.map { it.acquireSomethingFromSomewhere(keyword) }
.flatMap { Flux.concat(it) }
但是在RxJava中,我找不到任何可以解决我的问题的运算符,因为每个运算符都以Publisher
作为参数,而Flowable
没有实现它。
答案 0 :(得分:1)
首先,如果您在SELECT * FROM [dbo].[GetData](@Date, NULL,'Yearly')
中提供的函数返回一个map
,您将最终得到嵌套的Flowable(又称Flowable
),这可能不是您想要的。这是因为Flowable<Flowable<T>>
函数仅变换容器map
内的元素(在这种情况下,容器为(T) -> R
)。在您的情况下,您想在第一个容器内转换元素,并返回一个新的容器Flowable
,此函数称为flatMap
。对于 Rx ,根据其行为,您具有更多的功能(运算符),例如concatMap
和switchMap
,但是签名是相同的。
示例
(T) -> Flowable<R>
PS