结合多种流动性

时间:2019-01-26 20:54:27

标签: kotlin rx-java2 reactive-streams

我将我的项目从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没有实现它。

1 个答案:

答案 0 :(得分:1)

首先,如果您在SELECT * FROM [dbo].[GetData](@Date, NULL,'Yearly') 中提供的函数返回一个map,您将最终得到嵌套的Flowable(又称Flowable),这可能不是您想要的。这是因为Flowable<Flowable<T>>函数仅变换容器map内的元素(在这种情况下,容器为(T) -> R)。在您的情况下,您想在第一个容器内转换元素,并返回一个新的容器Flowable,此函数称为flatMap。对于 Rx ,根据其行为,您具有更多的功能(运算符),例如concatMapswitchMap,但是签名是相同的。

示例

(T) -> Flowable<R>

PS

如果您想进一步了解其背后的理论,则可以阅读Arrow-ktFunctorMonad文档